So, I feel the need to be recorded, so that after the encounter this problem again, and get answers from the idea.
Strange issue date conditions arise.
http://bbs.csdn.net/topics/390498925
select top 1 ekeyid,ProbeMaterial,Result,LabTestDate from PatientLabTestResults
where ProbeMaterial='Ca'
and LabTestDate between convert(datetime,2013/1/1) and
convert(datetime,'2013/6/24') order by LabTestDate desc
这样查的出结果,变成
select top 1 ekeyid,ProbeMaterial,Result,LabTestDate from PatientLabTestResults
where ProbeMaterial='Ca'
and LabTestDate between convert(datetime,2013/1/1) and
convert(datetime,2013/6/24) order by LabTestDate desc
So after not find the results, in fact, just removed 2013/6/24's' number only, that we can understand what is the problem?
-
if OBJECT_ID('t') is not null
-
drop
table t
-
go
-
-
create
table t(d datetime)
-
-
-
insert
into t
-
select
cast(
'2013-05-01'
as datetime)
as d
-
union all
-
select
cast(
'2013-05-10'
as datetime)
-
-
-
/*
-
1.
-
-
通过查询计划能看出,SQL Server把下面的查询转化成了:
-
-
select * from t where d >= convert(datetime,2013/5/1,0) and d <= convert(datetime,'2013/6/24',0)
-
-
也就是查询条件:
-
d >= convert(datetime,2013/5/1,0) and d <= convert(datetime,'2013/6/24',0)
-
-
进一步转化:
-
d >= '1901-02-07 00:00:00.000' and d <= 2013-06-24 00:00:00.000
-
-
这样就能查询出结果集。
-
*/
-
select *
-
from t
-
where d
between
convert(datetime,
2013/
5/
1)
and
convert(datetime,
'2013/6/24')
-
-
-
-
/*
-
2.
-
-
通过查询计划能看出,SQL Server把下面的查询转化成了:
-
-
select * from t where d >= convert(datetime,2013/5/1,0) and d <= convert(datetime,2013/6/24,0)
-
-
也就是查询条件:
-
d >= convert(datetime,2013/5/1,0) and d <= convert(datetime,2013/6/24,0)
-
-
进一步转化:
-
d >= '1901-02-07 00:00:00.000' and d <= '1900-01-14 00:00:00.000'
-
-
由于SQL Server 把2013/6/24中的斜杠,当成了除号,也就是按除法计算了,
-
比如:2013/6/24 就等于13,那么由于datetime默认值是默认值: 1900-01-01 00:00:00,
-
那么加上13后,就是1900-01-14 00:00:00.000,这样后就查不出结果了.
-
*/
-
select *
-
from t
-
where d
between
convert(datetime,
2013/
5/
1)
and
convert(datetime,
2013/
6/
24)
In fact,
2013/5/1 is a division operation, the result is 402.
After 2013/6/24 do the divisions, it is 13.
Since the default data type is datetime: "1900-01-01 00:00:00",
Therefore, the above convert (datetime, 2013/5/ 1) is' 1900-01-01 00:00:00 'plus 402,
that is,' 1901-02-0700: 00: 00.000 ",
And convert (datetime, 2013/6/ 24) that is' 1900-01-01 00:00:00 'plus 13,
that is,' 1900-01-1400: 00: 00.000 ",
So you will not find the results.
Therefore, the above should be rewritten 2013/5/1 "2013/5/1", must be in quotation marks.