1

我花了很多时间试图弄清楚如何在 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 和过滤器语法之间有明显的区别,但我找不到详细的解释它们到底是什么。

4

2 回答 2

2

实际上,我对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
于 2013-04-11T09:37:25.363 回答
0

关于 (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
于 2013-08-19T14:02:53.830 回答