有关ADO记录集筛选器查询语法的信息
我花了很多时间试图弄清楚如何在连接到使用mdb文件工作的Jet引擎的ado记录集筛选器表达式中提取日期部分。问题是关于sql的访问风格(例如日期函数)提到的许多事情在那里不起作用产生错误。格式化日期#mm/dd/yyyy hh:mm:ss#在比较中有效,但会产生不正确的结果。有什么样的表达方式可以为过滤器提供可靠的信息来源,以及我可以使用哪些功能?有关ADO记录集筛选器查询语法的信息
UPDATE
使用的版本是,当我选择微软JET 4.0 OLE DB提供程序。通常可以期望过滤标准可以使用与SQL查询中的WHERE关键字后面的查询部分相同的语法。我的任务是比较时间戳记的日期部分,并最终决定使用查询而不是过滤表格,但下面的示例工作时,它是sql查询的一部分(在WHERE之后)并引发“应用程序使用的参数错误类型的,超出可接受的范围内,或者是彼此”错误发生冲突时,它的过滤器
format(TimeStamp,"yyyy/mm/dd")=format(#04/11/2013#,"yyyy/mm/dd")
所以我看到还有的地方和过滤器语法之间的显着差异的内容,但我可以没有找到详细的解释他们究竟是什么。
我很惊讶WHERE Format([TimeStamp]...
在针对Access数据库引擎(ACE)的ADO查询中工作,但显然它确实如此。
我当然同意在Microsoft的文档中很难找到有关使用某些Microsoft功能的具体细节。我想这有助于保持像业务堆栈溢出这样的网站。 ;)
至于你.Filter
的问题,在这种情况下使用Format()
确实失败了,大概是因为Format()
是一个VBA函数,而不是(总是)可用于表达访问应用程序本身之外。但是,以下测试表明...
rst.Filter = "[TimeStamp] >= #2013/04/11# AND [TimeStamp]<#2013/04/12#"
...确实有效。 ( - 00:00:00
- 当用于DateTime值然后午夜没有指定时间假设。)
测试数据:
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
好像你的过滤器工作,虽然我在文档(http://technet.microsoft.com/en-us/library/cc966377.aspx)中看到Jet只使用MM/DD/YYYY格式,但您的YYYY/MM/DD不同,但工作正常。 – Maksee 2013-04-11 10:11:26
@Maksee在早些时候,Jet数据库引擎坚持以m/d/y格式处理日期文字* *。在某处(可能随着Jet_3或Jet_4的发布),它开始接受yyyy/mm/dd日期文字,但大部分文档仍然仅指m/d/y格式。 – 2013-04-11 10:39:23
关于(VBA)ADO过滤器语法(也适用于DAO)的简短说明:
该过滤器应指定为:“[Fieldname] =” 其中Fieldname是记录集中字段的现有名称,可以是任何可以由字符串表示的名称。一个非字符串会被转换为一个字符串,因为filtervalue将被转换为一个显式的SQL WHERE语句(Allways一个字符串)。
有效的过滤器将是:
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
请注明您所使用的MS Access版本。如果您可以提供您正在遇到的功能,字段,字段格式和错误的示例,这也会很有帮助。 – Taliesin 2013-04-10 16:06:17
@Taliesin,更新了问题 – Maksee 2013-04-11 08:25:58