在 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 中使用日期的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter模型中的Mysql日期格式

如何在 DatePickerDialog 中以越南语显示月份和日期?

表的创建:整形类型,浮点类型和定点数类型,日期和时间类型

arcEngine开发之查询的相关接口

CRe01

更新模板内变量的值 - django