日期:2014-05-17  浏览次数:20559 次

关于日期条件出现的奇怪问题
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
这样后就查不出结果了,其实只是去除了2013/6/24的'号而已,这个大家能理解是什么问题吗?

------解决方案--------------------


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'