我正在尝试比较SQL语句中的两个日期。我在DataBase中使用的日期格式是DD/MM/YYYY
。
当我编写以下sql时:
SELECT * FROM [MyTableName]
WHERE #03/10/2014# >= #02/11/2014#;
WHERE语句的结果是True
-(不好)。
根据我想要的格式(DD/MM/YYYY
),它应该是假的,但是在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()日期时,问题再次出现:
这个语句应该是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()日期上不能正常工作。
有人能解决这个问题吗?
发布于 2014-11-03 17:30:58
使用#
字符分隔的日期文本通常会以MM/DD/YYYY
格式解释表单NN/NN/NNNN
的值--而不管您的区域性设置如何。
在某些情况下,例如当第一组数字大于12时,环境可能选择按DD/MM/YYYY
顺序解释值以处理输入,但这是不应该依赖的非标准行为。
具体来说,VB日期数据类型的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
函数在查询日期对象之前将字符串解析为date对象。
https://stackoverflow.com/questions/26719241
复制相似问题