我有一张日期表,所有日期都发生在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
答案 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。