查询比较SQL中的日期

时间:2013-11-12 08:27:04

标签: sql sql-server date compare

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

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-04-12'

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

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

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

如何解决这个问题?

Created_date的类型为日期

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

7 个答案:

答案 0 :(得分:63)

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

如果你想与12月4日 th 进行比较,你应该写'20131204'。如果你想与4月12日 th 进行比较,你应该写'20130412'。

SQL Server文档中的文章Write International Transact-SQL Statements解释了如何编写文化不变的语句:

  

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

修改

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

<强>更新

要在文字中使用ISO 8601格式,必须指定所有元素。引用from the ISO 8601 section of datetime's documentation

  

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

     

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

答案 1 :(得分:26)

试试这个

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-12-04'

答案 2 :(得分:6)

如果您只与日期值进行比较,那么将其转换为日期(不是日期时间)将会有效

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

此转换也适用于使用 GetDate()功能

答案 3 :(得分:4)

你放<=它也会捕捉到给定的日期。您只能将其替换为<

答案 4 :(得分:2)

请尝试以下查询

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
convert(datetime, convert(varchar(10), created_date, 102))  <= convert(datetime,'2013-04-12')

答案 5 :(得分:1)

尝试使用&#34;#&#34;在日期之前和之后,确保您的系统日期格式。也许&#34; YYYYMMDD O YYYY-MM-DD O MM-DD-YYYY O使用&#39; / O \&#39; &#34;

例如:

 select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= #2013-04-12#

答案 6 :(得分:0)

日期格式为yyyy-mm-dd。 因此上述查询正在查找早于12Apr2013的记录

建议您通过将日期字符串设置为“2013-04-30”进行快速检查,如果没有sql错误,则确认日期格式为yyyy-mm-dd。