【问题标题】:Information about syntax of ADO recordset filter queries有关 ADO 记录集筛选器查询语法的信息
【发布时间】:2013-04-09 14:22:04
【问题描述】:

我花了很多时间试图弄清楚如何在 ado 记录集过滤器表达式中提取日期部分,该表达式连接到使用 mdb 文件的 Jet 引擎。问题是关于 sql 的访问风格(例如日期函数)提到的许多事情在此处不起作用,从而引发错误。在比较中使用 #mm/dd/yyyy hh:mm:ss# 格式化日期有效,但结果不正确。是否有可靠的信息来源说明哪些表达式适用于过滤器以及我可以使用哪些功能?

更新

使用的版本是我选择 Microsoft JET 4.0 OLE DB Provider 时的版本。通常人们会期望过滤条件可以使用与 SQL 查询中 WHERE 关键字之后的查询部分相同的语法。我的任务是比较时间戳的日期部分,我最终决定使用查询而不是过滤表,但是当它是 sql 查询的一部分(在 WHERE 之后)并引发 “应用程序正在使用参数时,以下示例有效类型错误、超出可接受范围或相互冲突” 过滤器内容错误

format(TimeStamp,"yyyy/mm/dd")=format(#04/11/2013#,"yyyy/mm/dd")

所以我看到 WHERE 和过滤器语法之间存在明显差异,但我找不到详细解释它们到底是什么。

【问题讨论】:

  • 请说明您使用的 MS Access 版本。如果您能提供一个有关您遇到的函数、字段、字段格式和错误的示例,也会很有帮助。
  • @Taliesin,更新了问题

标签: ms-access ado jet


【解决方案1】:

我真的很惊讶WHERE Format([TimeStamp]... 在针对 Access 数据库引擎 (ACE) 的 ADO 查询中起作用,但显然确实如此。

我当然同意在 Microsoft 的文档中很难找到有关使用某些 Microsoft 功能的具体细节。我想这有助于保持 Stack Overflow 等网站的业务。 ;)

至于您的.Filter 问题,在这种情况下使用Format() 确实会失败,可能是因为Format() 是一个VBA 函数,并且不能(总是)可用于Access 应用程序本身之外的表达式。但是,下面的测试表明...

rst.Filter = "[TimeStamp] >= #2013/04/11# AND [TimeStamp]<#2013/04/12#"

...确实有效。 (如果没有为 DateTime 值指定时间,则假定为午夜 - 00:00:00。)

测试数据:

ID  TimeStamp
1   2013-04-10 21:22:00
2   2013-04-11 02:34:56
3   2013-04-11 04:45:15

测试代码:

Sub foo()
Dim con As ADODB.Connection, rst As ADODB.Recordset

Set con = New ADODB.Connection
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=C:\Users\Gord\Desktop\Database1.accdb;"
Set rst = New ADODB.Recordset

Debug.Print "Test 1: WHERE Format([TimeStamp]..."
rst.Open _
        "SELECT * FROM [TimeStampData] " & _
        "WHERE Format([TimeStamp], ""yyyy/mm/dd"") = Format(#2013/04/11#, ""yyyy/mm/dd"")", _
        con, adOpenKeyset, adLockOptimistic
Debug.Print "Records returned: " & rst.RecordCount
rst.Close
Debug.Print

Debug.Print "Test 2: Filter"
rst.Open "SELECT * FROM [TimeStampData]", con, adOpenKeyset, adLockOptimistic
Debug.Print "Total records: " & rst.RecordCount
rst.Filter = "[TimeStamp] >= #2013/04/11# AND [TimeStamp]<#2013/04/12#"
Debug.Print "Filtered records: " & rst.RecordCount
rst.Close

Set rst = Nothing
con.Close
Set con = Nothing
End Sub

测试结果:

Test 1: WHERE Format([TimeStamp]...
Records returned: 2

Test 2: Filter
Total records: 3
Filtered records: 2

【讨论】:

  • 似乎您的过滤器确实有效,尽管我在文档 (technet.microsoft.com/en-us/library/cc966377.aspx) 中看到 Jet 仅使用 MM/DD/YYYY 格式,但您的 YYYY/MM/DD 不同,但可以正常工作。
  • @Maksee 在早期,Jet 数据库引擎非常坚持处理 m/d/y 格式的日期文字。一路走来(可能随着 Jet_3 或 Jet_4 的发布)它开始接受 yyyy/mm/dd 日期文字,但大部分文档仍然只涉及 m/d/y 格式。
【解决方案2】:

关于 (VBA) ADO 过滤器语法的简短说明(也适用于 DAO):

过滤器应指定为:“[Fieldname] =” 其中 Fieldname 是记录集中字段的现有名称,可以是任何可以用字符串表示的名称。非字符串始终转换为字符串,因为过滤器值将转换为显式 SQL WHERE 语句(始终为字符串)。

有效的过滤器是:

rst.Filter="[TimeStamp] = #2013/04/12#" '(Mind the hashes as a date is expected. Peculiarly all localised notations are accepted!)

rst.Filter="[TimeStamp] = #" & strDatevalue & "#" 'Where strDatevalue is a datevalue as text.

因此这将起作用:

rst.Filter="[TimeStamp] = #" & format(#04/11/2013#,"mm/dd"/yyyy) & "#" 
'Mind: Access expects here an American standard date format, i.e. month/day/year
'(In that case you could even leave the hashes away!)

IF

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多