在 CreateQueryDef 中使用日期
Posted
技术标签:
【中文标题】在 CreateQueryDef 中使用日期【英文标题】:Using date in CreateQueryDef 【发布时间】:2015-06-23 07:54:13 【问题描述】:我有一个表,我在该表上运行导出到 Excel 的查询。
这是一个例子:
餐桌:食物
Item | Price | Limit_Date |
-------------------------------
Carrot | 0.80 | 08/07/2015 |
Salmon | 4.30 | 01/07/2015 |
Biscuits | 2.40 | 15/12/2015 |
Milk | 1.00 | 25/06/2015 |
我在 vba 中运行这段代码:
代码
Dim cdb as DAO.Database
Dim qdf as DAO.QueryDef
Set cdb = CurrentDb
Const xlsxPath = "C:\Users\Tom\Documents\Foo.xlsx"
Set qdf=cdb.CreateQueryDef("Omnomnomnom", _
"SELECT Item, Price FROM Food WHERE Limit_Date >= [pDate];")
Set qdf=Nothing
DoCmd.TransferSpreadsheet acExport, acExport, acSpreadsheetTypeExcel112Xml, "Omnomnomnom", xlsxPath, True
DoCmd.DeleteObject acQuery, "Omnomnomnom"
它运行良好,但我想用硬编码日期替换参数[pDate]
,这样访问就不再需要它了。
这是我迄今为止尝试过的:
使用#01/07/2015#
将DateValue("1 July 2015")
与#
一起使用
将Format("01/07/2015", "dd/mm/yyyy")
与#
一起使用
对于每一种情况,查询都会返回表中的所有内容,就像它没有考虑日期一样。我已经检查了我的 Limit_Date 字段是我表中的日期/时间。并且没有错误弹出。
只有在我保留[pDate]
并且在访问提示我时手动输入01/07/2015
时,该查询才有效。
【问题讨论】:
【参考方案1】:Access 中的日期需要用#
标记括起来,以便识别您已过的日期。另一个需要考虑的重要因素是 JET 要求日期格式为mm/dd/yyyy
,而不是普通的dd/mm/yyyy
。所以您的问题是因为您使用的是#
,但格式错误或没有#
的正确格式。所以尝试使用类似的东西,
Dim cdb as DAO.Database
Dim qdf as DAO.QueryDef
Set cdb = CurrentDb
Const xlsxPath = "C:\Users\Tom\Documents\Foo.xlsx"
Set qdf=cdb.CreateQueryDef("Omnomnomnom", _
"SELECT Item, Price FROM Food WHERE Limit_Date >= #07/01/2015#;")
Set qdf=Nothing
DoCmd.TransferSpreadsheet acExport, acExport, acSpreadsheetTypeExcel112Xml, "Omnomnomnom", xlsxPath, True
DoCmd.DeleteObject acQuery, "Omnomnomnom"
有一些有趣的文章International Date Formats in Access,作者 Allen Browne。希望这会有所帮助!
【讨论】:
它现在可以工作了,但你能解释一下为什么当我在请求 pdate 时手动输入 01/07/2015 时,Access 会毫无问题地执行我的查询吗?问题不是基本一样吗? 否,因为当您使用a Parameter 时,DB 引擎会将数据类型映射到传递的参数。当您对日期值进行硬编码时,编译器直到执行点才知道数据类型是什么。这就是说明符#
指示它是 Date 类型的原因,a'
指示 String 类型,而其他任何东西都是 Number 类型。当使用#
时,它以美国格式构造数据,这在使用查询构建器或参数时自动完成。希望这会有所帮助!【参考方案2】:
您必须将日期格式化为字符串表达式以与 SQL 连接:
Dim sDate As String
sDate = Format(pDate, "yyyy\/mm\/dd")
Set qdf=cdb.CreateQueryDef("Omnomnomnom", _
"SELECT Item, Price FROM Food WHERE Limit_Date >= # & sDate & "#;")
【讨论】:
以上是关于在 CreateQueryDef 中使用日期的主要内容,如果未能解决你的问题,请参考以下文章