关于日期条件出现的奇怪问题

YueGuangZhiDi 2013-06-24 05:46:32
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的'号而已,这个大家能理解是什么问题吗?
...全文
269 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
YueGuangZhiDi 2013-07-03
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
其实就是, 2013/5/1 就是一个除法运算,结果为402。 2013/6/24 做除法运算后,就是13。 由于datetime数据类型的默认值为:'1900-01-01 00:00:00', 所以上面的convert(datetime,2013/5/1)就是'1901-02-07 00:00:00.000', 而convert(datetime,2013/5/1)就是'1900-01-14 00:00:00.000', 所以就会查不出结果来。 所以,上面的2013/5/1 要写成 '2013/5/1',一定要加上引号。
完全没有意识到这个问题。。。。
LongRui888 2013-06-24
  • 打赏
  • 举报
回复
其实就是, 2013/5/1 就是一个除法运算,结果为402。 2013/6/24 做除法运算后,就是13。 由于datetime数据类型的默认值为:'1900-01-01 00:00:00', 所以上面的convert(datetime,2013/5/1)就是'1900-01-01 00:00:00' 再加上402, 就是'1901-02-07 00:00:00.000', 而convert(datetime,2013/6/24)就是是'1900-01-01 00:00:00' 再加上 13, 就是'1900-01-14 00:00:00.000', 所以就会查不出结果来。 所以,上面的2013/5/1 要写成 '2013/5/1',一定要加上引号。
LongRui888 2013-06-24
  • 打赏
  • 举报
回复
其实就是, 2013/5/1 就是一个除法运算,结果为402。 2013/6/24 做除法运算后,就是13。 由于datetime数据类型的默认值为:'1900-01-01 00:00:00', 所以上面的convert(datetime,2013/5/1)就是'1901-02-07 00:00:00.000', 而convert(datetime,2013/5/1)就是'1900-01-14 00:00:00.000', 所以就会查不出结果来。 所以,上面的2013/5/1 要写成 '2013/5/1',一定要加上引号。
LongRui888 2013-06-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'
 
由于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)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧