我正在使用MS-Access 2007 DB。
我正在尝试编写Datetime的查询,我想在12月14日到12月16日之间获取记录,所以我写了下面的查询。
SELECT * FROM Expense WHERE CreatedDate > #14-Dec-15# and CreatedDate < #16-Dec-15#
(我必须使用两个日期进行查询。)
但它返回CreatedDate的记录是12月14日... 查询有什么问题?
答案 0 :(得分:2)
正如@vkp在评论中提到的那样,日期也有time
部分。如果未定义,则默认为午夜(00:00:00
)。由于14-dec-2015 6:46:56
位于14-dec-2015 00:00:00
之后,它将包含在结果集中。您可以使用>= 15-dec-15
来解决此问题,因为它还包括2015年12月15日的记录。结束日期也一样。
答案 1 :(得分:1)
你必须考虑到你的思考时间:
编辑:我写错了这个,你想要 包括12月14日至16日(三整天)的数据行。
如果您要写<#17-Dec-15#
,那么它将是完整的第16位。或者你必须写<=#16-Dec-15 23:59:59#
。
12月16日的DateTime,其中TimePart为12:30比#16-Dec-15#...
只是一些backgorund:在Ms-Access中,DateTime被存储为日期的数字和时间的一小部分。 0.5
正午,0.25
早上6点......
比较DateTime值意味着比较现实中的Double值。
答案 2 :(得分:1)
似乎您只想要12月15日的记录,而不管CreatedDate
中存储的时间。如果是这样的话,假设CreatedDate
...
SELECT *
FROM Expense
WHERE CreatedDate >= #2015-12-15# and CreatedDate < #2015-12-16#;
谨防在WHERE
条件中将功能应用于目标字段...例如CDATE(INT(CreatedDate))
。虽然在逻辑上是正确的,但它会强制进行全表扫描。如果您的Expense
表只包含几行,那可能不是问题。但对于一个巨大的表,你真的应该尽量避免全表扫描。
答案 3 :(得分:0)
只需在结束日期中添加一天,并将其排除在外:
SELECT * FROM Expense WHERE CreatedDate >= #2015/12/14# AND CreatedDate < #2015/12/17#
答案 4 :(得分:0)
非常感谢你们的帮助......
我终于得到了Darren Bartrup-Cook和Gustav给出的解决方案......
我之前的询问是......
SELECT * FROM Expense WHERE CreatedDate > #14-Dec-15# and CreatedDate < #16-Dec-15#
新工作查询是......
SELECT * FROM Expense WHERE CDATE(INT(CreatedDate)) > #14-Dec-15# and CDATE(INT(CreatedDate)) < #16-Dec-15#