我有一个带有日期时间列Set
的表信息。
我尝试了以下2条SQL语句:
begindate
第一个查询结果正确,但是第二个查询结果错误地包含了那些晚于“ 06/30/2017”的开始日期。
有人可以告诉我这是什么原因吗?是否有任何在线资源?谢谢
答案 0 :(得分:5)
原因是字符串比较和DateTime
比较的工作方式不同。
在任何情况下,您都不希望转换列的值,因为它将阻止SQL Server使用可能包含此列的任何索引。
最好的做法是将列中的数据与DateTime
数据类型而不是字符串进行比较。
如果您将文字字符串用于DateTime
值,则最好的选择是使用ISO 8601格式-yyyy-mm-ddTHH:mm:ss.mmm
(2018-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'