我花了很多时间试图弄清楚如何在连接到使用mdb文件的Jet引擎的ado记录集过滤器表达式中提取日期部分。问题是提到的关于sql的访问风味的许多事情(例如日期函数)在那里引起错误。格式化日期#mm / dd / yyyy hh:mm:ss#in comparisons有效,但结果不正确。是否有可靠的信息来源,说明哪种表达式适用于过滤器以及我可以使用哪些功能?
更新
使用的版本是我选择Microsoft JET 4.0 OLE DB Provider时的版本。通常,人们会期望过滤条件可以使用与SQL查询中WHERE关键字之后的查询部分相同的语法。我的任务是比较时间戳的日期部分,我最终决定使用查询而不是过滤表,但以下示例在sql查询的一部分(在WHERE之后)并且引发“应用程序正在使用参数时起作用类型错误,超出可接受的范围,或者当它是过滤器的内容时彼此冲突“错误
format(TimeStamp,"yyyy/mm/dd")=format(#04/11/2013#,"yyyy/mm/dd")
所以我看到WHERE和过滤器语法之间存在明显差异,但我找不到具体的解释。
答案 0 :(得分: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
答案 1 :(得分:0)
关于(VBA)ADO过滤器语法的简短说明(也适用于DAO):
过滤器应指定为:“[Fieldname] =” 其中Fieldname是记录集中字段的现有名称,可以是可由字符串表示的任何内容。非字符串总是转换为字符串,因为filtervalue将转换为显式SQL WHERE语句(Allways a string)。
有效过滤器将是:
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