在SQL中查询比较date

我有一张桌子,date都是在十一月份发生的。 我写了这个查询

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

此查询应该返回11月(11月)发生的所有事件,因为它发生 2013年12月12日之前 (12月)

但是它只返回发生在小于04( 2013-04-12

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

如何解决这个问题?

Created_date的types是date

date格式默认是yyyy-dd-MM

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

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

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

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

编辑

由于您正在使用ADO,最好的select是参数化查询并将date值作为dateparameter passing。 这样你就完全避免了格式问题,并且也获得了参数化查询的性能优势。

UPDATE

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

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

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

像这样尝试

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

你把<= ,它也会赶上给定的date。 你可以用<只replace它。

请尝试下面的查询

 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') 

如果你只是比较date价值,然后将其转换为date(而不是date时间 )将工作

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

此转换也适用于使用GetDate()函数

尝试在date前后使用“#”,并确保系统date格式。 也许是“YYYYMMDD O YYYY-MM-DD O MM-DD-YYYY O USING'/ O \'”

例如:

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

date格式是yyyy-mm-dd。 所以上面的查询正在查找比12Apr2013更早的logging

build议您通过将datestring设置为“2013-04-30”进行快速检查,如果没有sql错误,date格式被确认为yyyy-mm-dd。