在MS Access Query中使用datetime参数时给出错误的记录

时间:2015-12-15 15:48:22

标签: sql ms-access

我正在使用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日... 查询有什么问题?

enter image description here

5 个答案:

答案 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#