博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
阅读量:5069 次
发布时间:2019-06-12

本文共 2101 字,大约阅读时间需要 7 分钟。

 

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

 

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

 

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

 

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 tgocreate table t(d datetime)insert into tselect cast('2013-05-01' as datetime) as dunion allselect 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 twhere 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 twhere d between convert(datetime,2013/5/1) and  convert(datetime,2013/6/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',一定要加上引号。

转载于:https://www.cnblogs.com/momogua/p/8304459.html

你可能感兴趣的文章
linux正则表达式回忆记录
查看>>
Response.Buffer = True
查看>>
有趣的python range()函数
查看>>
webpack执行命令失败之解决办法
查看>>
理解Mapreduce
查看>>
C语言的变量的作用域和生存期
查看>>
NIS & Kerberos配置
查看>>
【转】非常好的Java反射例子
查看>>
安装clamav对centos系统进行病毒查杀
查看>>
poj3744 Scout YYF I
查看>>
常用Flex 布局归置 》仅做笔记 (scss)
查看>>
Qt-Qml-隐藏标题栏-程序依附任务栏
查看>>
说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
查看>>
前端技术——bootstrap
查看>>
IGMP相关
查看>>
面试题收集-腾讯
查看>>
【2019/5/18】周进度报告
查看>>
获取随机数
查看>>
block
查看>>
plsql 输出当月的所有日期
查看>>