我试图在我的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()日期无法正常工作 有人有解决方案吗?
答案 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
函数将字符串解析为日期对象。