Ori*_*ent 2 sql t-sql sql-server
注意这是我的第一篇帖子:)
我正在研究一个程序,我看到一些表现出乎意料的代码.我知道有一些隐含的数据转换,但我不明白它如何评估为真......
我运行了下面的代码,它按照我的预期拉出"是"而不是"否".
代码使用了GETDATE().我把它改成了今天的日期,所以代码可以在另一天运行,如果只需要这个帖子.
SELECT CASE
WHEN CONVERT(VARCHAR,CAST('6/14/2016' AS DATETIME),101) BETWEEN '06/13/2014' AND '07/04/2014'
THEN 'Yes'
ELSE 'NO'
END
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释它的评估结果如何?
您正在比较日期转换为的字符串VARCHAR
.我打赌字符串按字母顺序排序.让我们测试一下这个理论:
declare @t table (a varchar(10))
insert into @t select '06/14/2016'
insert into @t select '06/13/2014'
insert into @t select '07/04/2014'
select a from @t order by a
Run Code Online (Sandbox Code Playgroud)
这将输出:
a
----------
06/13/2014
06/14/2016
07/04/2014
(3 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
您的2016日期是第2条记录,因此它将介于其他日期之间.如果您想将这些视为日期,请不要转换为VARCHAR
.然后其他两个日期将隐式转换为日期类型:
SELECT CASE WHEN CAST('6/14/2016' AS DATETIME) BETWEEN '06/13/2014' AND '07/04/2014' THEN 'Yes' ELSE 'NO' END
Run Code Online (Sandbox Code Playgroud)
将输出您期望的NO.
PS:为了避免不可预测的结果,始终声明/转换VARCHAR(n)
为VARCHAR
转换而不指定大小使用它遇到的第一个字符串来确定结果集中列的大小,其余的可能被截断.