将日期转换为varchar然后比较

时间:2018-08-09 06:51:39

标签: sql sql-server sql-server-2012

我有一个带有日期时间列Set的表信息。

我尝试了以下2条SQL语句:

begindate

第一个查询结果正确,但是第二个查询结果错误地包含了那些晚于“ 06/30/2017”的开始日期。

有人可以告诉我这是什么原因吗?是否有任何在线资源?谢谢

2 个答案:

答案 0 :(得分:5)

原因是字符串比较和DateTime比较的工作方式不同。

在任何情况下,您都不希望转换列的值,因为它将阻止SQL Server使用可能包含此列的任何索引。

最好的做法是将列中的数据与DateTime数据类型而不是字符串进行比较。

如果您将文字字符串用于DateTime值,则最好的选择是使用ISO 8601格式-yyyy-mm-ddTHH:mm:ss.mmm2018-06-30T00:00:00)或其他不太易理解的替代方法{{1 }}(yyyymmdd),如果您只关心日期本身-这将使SQL Server可以将字符串值正确转换为20180630,因为它是明确的且与文化无关。

顺便说一句,you should stop using DateTime and switch to DateTime2 instead.

答案 1 :(得分:0)

我检查了

第一个查询:由于您正在比较datetime与字符串Date

,该查询将为您返回没有正确比较的行。
SELECT * 
FROM info 
WHERE begindate>'06/30/2018'

第二个查询:正常运行(请参阅脚本)

SELECT * 
FROM info 
WHERE convert(varchar,begindate,101)>'06/30/2018'

这是脚本:

CREATE TABLE INFO
(
beginDate datetime NULL
)

INSERT INTO INFO VALUES ('2018-07-30 12:28:06.167')
INSERT INTO INFO VALUES ('2018-07-03 12:28:06.167')


SELECT * FROM info where begindate>'06/30/2018'

SELECT * FROM info where convert(varchar,begindate,101)>'06/30/2018'