SQL - 比较WHERE语句中的日期在Access DB中无法正常工作

时间:2014-11-03 17:08:09

标签: sql datetime ms-access

我试图在我的SQL语句中比较两个日期。我在DataBase中使用的日期格式为DD/MM/YYYY

当我写下面的sql:

SELECT * FROM [MyTableName]  
WHERE #03/10/2014# >= #02/11/2014#; 

WHERE语句的结果是True - (不好) 根据我想要的格式(DD/MM/YYYY),它应该是False,但在SQL语句中它以MM/DD/YYYY格式显示。

当我使用Now()函数时出现了同样的问题:

WHERE NOW() >= #02/12/2014#; 

今天是2014年11月3日
它应该是False,因为11 < 12但声明仍为True。 (使用MM/DD/YYYY格式的SQL)。

所以我添加了FORMAT函数,现在它看起来像是:

WHERE FORMAT(#03/10/2014#, 'DD/MM/YYYY') >= FORMAT(#02/11/2014#, 'DD/MM/YYYY');  

这次WHERE语句的结果是Flase - (好!) 到目前为止,Format函数看起来是一个很好的解决方案,但是当尝试重新格式化NOW()Date时,问题又出现了:

此WHERE语句应为True

WHERE FORMAT(NOW(), 'DD/MM/YYYY') = FORMAT(#03/11/2014#, 'DD/MM/YYYY'); 

但它是False

虽然这个WHERE语句应该是False

WHERE FORMAT(NOW(), 'DD/MM/YYYY') = FORMAT(#11/03/2014#, 'DD/MM/YYYY'); 

它是True

今天是2014年11月3日

我们可以看到格式功能在NOW()日期无法正常工作 有人有解决方案吗?

1 个答案:

答案 0 :(得分:2)

日期文字(以#字符分隔)通常会以NN/NN/NNNN格式解释MM/DD/YYYY格式的值 - 无论您的文化设置如何。

在某些情况下,例如当第一组数字是> 12,环境可能选择以DD/MM/YYYY顺序解释值只是为了处理输入,但这是你不应该依赖的非标准行为。

具体而言,the VB Date Data Type的MSDN文档说明如下:

  

您必须在数字符号(##)中包含日期文字。您必须以M / d / yyyy格式指定日期值,例如#5/31/1993#。此要求与您的区域设置和计算机的日期和时间格式设置无关。

     

这种限制的原因是代码的含义永远不会改变,具体取决于运行应用程序的语言环境。假设您对#3/4/1998#的日期字面值进行硬编码并打算将其表示为1998年3月4日。在使用mm / dd / yyyy的区域设置中,按照您的意图编译3/4/1998。但假设您在许多国家/地区部署应用程序。在使用dd / mm / yyyy的语言环境中,您的硬编码文字将编译为1998年4月3日。在使用yyyy / mm / dd的语言环境中,文字将无效(1998年4月,0003)并导致编译器错误。

这适用于VB,以及VBA和MS Access。

解决此问题的一种方法是使用日期文字。相反,在使用它查询之前,请考虑使用DateValue函数将字符串解析为日期对象。