97

我有一张表,上面有所有发生在 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

4

10 回答 10

100

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

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

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

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

编辑

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

更新

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

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

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

于 2013-11-12T08:29:34.227 回答
35

像这样试试

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-12-04'
于 2013-11-12T08:32:12.460 回答
15

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

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

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

于 2016-04-13T12:35:27.047 回答
4

请尝试以下查询

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')
于 2013-11-12T08:32:29.183 回答
4

你放<=了它,它也会捕捉到给定的日期。您可以将其替换为<only。

于 2013-11-12T08:33:08.833 回答
0

日期格式为 yyyy-mm-dd。所以上面的查询是寻找早于 12Apr2013 的记录

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

于 2013-11-12T08:31:24.843 回答
0

将它们转换为相同格式的日期,然后您可以进行比较。像这样尝试:

where convert(date, created_date,102) <= convert(date,                                  /*102 is ANSI format*/
                                                    substring('2013-04-12',1,4) + '.' + /*year*/
                                                    substring('2013-04-12',9,2) + '.' + /*month*/
                                                    substring('2013-04-12',6,2)         /*day*/
                                                ,102)
于 2021-08-12T06:01:46.100 回答
0

下面的查询可用于查找 2013 年 11 月的记录。

Select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where Month(created_date) = 11 and Year(created_date) = 2013
于 2021-11-08T15:12:28.373 回答
0

尝试在日期前后使用“#”,并确保您的系统日期格式。也许“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#
于 2016-07-15T17:40:06.433 回答
0

您还可以使用 to_char(column_name, 'YYYY-MM-DD) 更改格式

于 2021-08-14T13:23:21.233 回答