使用转换时比较SQL Server中的日期

时间:2016-12-12 22:37:37

标签: sql sql-server

我尝试编写一个查询,当某个列(值)早于1/1/1996时返回所有记录。该列的数据类型为varchar,因此我首先将其转换为datetime格式。

以下是查询:

select *
from T1
where convert(varchar(20), convert(datetime, value), 113) > convert(varchar(20),   convert(datetime, '1/1/1996'), 113) 

我收到很多结果,包括日期<的记录1/1/1996

我做错了什么?

4 个答案:

答案 0 :(得分:4)

只是比较日期:

 where convert(datetime, value, 113) < '1996-01-01'

如果您需要,只能出于某种原因进行转换。

对于常数,请使用ISO标准格式,例如YYYY-MM-DD。

答案 1 :(得分:1)

在SQL Server中有很多方法可以CONVERT或CAST日期时间。其他人已经很好地介绍了CONVERT(datetime,value,113),但我注意到您的评论'10/9/2001 11:00:00 PM'错误转换,这是因为格式113Europe default + mmillisecondsdon mon yyyy hh:mi:ss:mmm(24hr)

因此,您必须使用其他格式才能正常工作,但如果您在Microsoft文档https://msdn.microsoft.com/en-us/library/ms187928.aspx中阅读了可用格式列表。

所以'10/9/2001 11:00:00 PM'MM/dd/yyyy hh:mm:ss ttdd/MM/yyyy hh:mm:ss tt,这些格式都不是列表中的一个。

这意味着您要么必须剪切并重新排列字符串,要么只使用其他转换方法。

如果MM/dd/yyyy hh:mm:ss tt格式只使用CAST('10/9/2001 11:00:00 PM' AS DATETIME)

如果dd/MM/yyyy hh:mm:ss tt格式有点复杂,但如果您有SQL Server 2012 +,则可以使用TRY_PARSE('10/9/2001 11:00:00 PM' AS DATETIME USING 'en-GB')

由于这个原因,为什么不应该将DATETIME存储为字符串。

答案 2 :(得分:0)

试试这个

select *
from T1
where convert(datetime, value, 113) < convert(datetime, '1/1/1996', 113)

答案 3 :(得分:0)

SQL Server执行内部数据转换,因此如果您的列是DATE,那么这将非常简单。

但是,由于它存储为字符串(这是一个非常糟糕的主意),因此在使用之前必须先将其转换为DATE。

首先,测试您的专栏以确保您可以实际转换所有内容

Select Distinct Convert (DateTime, Value, 113) ConvertedDate From T1

如果这样可以顺利运行,请使用CONVERT将字符串列转换为日期,然后进行比较:

Select *
From T1
Where Convert (DateTime, Value, 113) > '1/1/1996'

如果你有一些时髦的值,那么使用ISDATE来过滤出好的数据

Select *
From T1
Where ISDATE (Value) = 1
   And Convert (DateTime, Value, 113) > '1/1/1996'