查询比较SQL中的日期

Hel*_*Out 67 sql sql-server compare date

我有一张日期表,所有日期都发生在11月.我写了这个查询

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-04-12'
Run Code Online (Sandbox Code Playgroud)

此查询应返回第11个月(11月)发生的所有事件,因为它发生 "2013-04-12"日期之前(12月)

但它只返回在小于04(2013- 04 -12)的日子里发生的可用日期

可能只是比较一天的部分吗?而不是整个约会?

如何解决这个问题?

Created_date的类型为date

日期格式默认为yyyy-dd-MM

Pan*_*vos 68

而不是'2013-04-12',其含义取决于当地文化,使用被认为是文化不变格式的'20130412'.

如果你想与12月4 比较,你应该写'20131204'.如果你想与4月12 比较,你应该写'20130412'.

文章写国际化Transact-SQL语句从SQL Server的文档解释了如何编写的文化不变的语句:

使用其他API或Transact-SQL脚本,存储过程和触发器的应用程序应使用未分离的数字字符串.例如,yyyymmdd为19980924.

编辑

由于您使用的是ADO,因此最好的选择是参数化查询并将日期值作为日期参数传递.这样您就可以完全避免格式问题,并获得参数化查询的性能优势.

UPDATE

要在文字中使用ISO 8601格式,必须指定所有元素.引用datetime文档的ISO 8601部分

要使用ISO 8601格式,必须以格式指定每个元素.这还包括T,冒号(:)和格式中显示的句点(.).

......第二个组件的分数是可选的.时间组件以24小时格式指定.

  • 2013-12-04是ISO8601中指定的格式. (3认同)

Nit*_*esh 28

试试这样吧

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-12-04'
Run Code Online (Sandbox Code Playgroud)

  • @PanagiotisKanavos自从[ISO 8601](http://en.wikipedia.org/wiki/ISO_8601)于1988年出版以来,以破折号分隔的格式**是国际格式.其他格式不鼓励和[嘲笑]( http://xkcd.com/1179/).即使您发布的文章["写国际Transact-SQL语句"](http://technet.microsoft.com/en-us/library/ms191307.aspx)也从来没有将'yyyymmdd'标识为任何类型的"国际"标准. (16认同)
  • 文化特定格式.那是4月12日还是12月4日?以虚线分隔的格式不是国际格式 (6认同)
  • 那么,当您需要存储国际客户的数据时会发生什么?或者日期来自遵循*用户*文化的网络浏览器?这些准则的存在是有原因的,只要不使用错误的格式,您就可以避免所有错误 (2认同)
  • @Nithesh 将于 4 月 12 日回归 (2认同)
  • 在日期周围添加单引号为我解决了这个问题.使用格式2/19/2015.更改为'2015年2月19日',它开始工作.谢谢你的简单想法. (2认同)

Bim*_*zee 6

如果您仅与日期值比较,则将其转换为日期(而不是datetime)将起作用

select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= convert(date,'2013-04-12',102)
Run Code Online (Sandbox Code Playgroud)

在使用GetDate()函数期间,此转换也适用