2013-04-09 99 views
1

我花了很多时间试图弄清楚如何在连接到使用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") 

所以我看到还有的地方和过滤器语法之间的显着差异的内容,但我可以没有找到详细的解释他们究竟是什么。

+0

请注明您所使用的MS Access版本。如果您可以提供您正在遇到的功能,字段,字段格式和错误的示例,这也会很有帮助。 – Taliesin 2013-04-10 16:06:17

+0

@Taliesin,更新了问题 – Maksee 2013-04-11 08:25:58

回答

2

我很惊讶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 
+0

好像你的过滤器工作,虽然我在文档(http://technet.microsoft.com/en-us/library/cc966377.aspx)中看到Jet只使用MM/DD/YYYY格式,但您的YYYY/MM/DD不同,但工作正常。 – Maksee 2013-04-11 10:11:26

+1

@Maksee在早些时候,Jet数据库引擎坚持以m/d/y格式处理日期文字* *。在某处(可能随着Jet_3或Jet_4的发布),它开始接受yyyy/mm/dd日期文字,但大部分文档仍然仅指m/d/y格式。 – 2013-04-11 10:39:23

0

关于(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