首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL -在Access DB中比较WHERE语句不正确工作的日期

SQL -在Access DB中比较WHERE语句不正确工作的日期
EN

Stack Overflow用户
提问于 2014-11-03 17:08:08
回答 1查看 1.8K关注 0票数 3

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

当我编写以下sql时:

代码语言:javascript
运行
复制
SELECT * FROM [MyTableName]  
WHERE #03/10/2014# >= #02/11/2014#; 

WHERE语句的结果是True -(不好)。

根据我想要的格式(DD/MM/YYYY),它应该是假的,但是在SQL语句中它以MM/DD/YYYY格式出现。

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

代码语言:javascript
运行
复制
WHERE NOW() >= #02/12/2014#; 

(今天是2014年11月3日)

它应该是False,因为11 < 12,但语句仍然是True。(使用MM/DD/YYYY格式的SQL )。

所以我添加了一个FORMAT函数,现在看起来是这样的:

代码语言:javascript
运行
复制
WHERE FORMAT(#03/10/2014#, 'DD/MM/YYYY') >= FORMAT(#02/11/2014#, 'DD/MM/YYYY');  

这次WHERE语句的结果是Flase -(很好!)

到目前为止,Format函数看起来是一个很好的解决方案,但是当试图重新格式化NOW()日期时,问题再次出现:

这个语句应该是True

代码语言:javascript
运行
复制
WHERE FORMAT(NOW(), 'DD/MM/YYYY') = FORMAT(#03/11/2014#, 'DD/MM/YYYY'); 

但它是False

虽然这个WHERE语句应该是False

代码语言:javascript
运行
复制
WHERE FORMAT(NOW(), 'DD/MM/YYYY') = FORMAT(#11/03/2014#, 'DD/MM/YYYY'); 

它是True

(今天是2014年11月3日)

我们可以看到,格式函数在NOW()日期上不能正常工作。

有人能解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 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对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26719241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档