在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。