我尝试编写一个查询,当某个列(值)早于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
我做错了什么?
答案 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'
错误转换,这是因为格式113
是Europe default + mmilliseconds
或don 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 tt
或dd/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'