原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)


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

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

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

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

这样后就查不出结果了,其实只是去除了2013/6/24的'号而已,这个大家能理解是什么问题吗?


  1. if OBJECT_ID('t') is not null
  2. drop table t
  3. go
  4. create table t(d datetime)
  5. insert into t
  6. select cast('2013-05-01' as datetime) as d
  7. union all
  8. select cast('2013-05-10' as datetime)
  9. /*
  10. 1.
  11. 通过查询计划能看出,SQL Server把下面的查询转化成了:
  12. select * from t where d >= convert(datetime,2013/5/1,0) and d <= convert(datetime,'2013/6/24',0)
  13. 也就是查询条件:
  14. d >= convert(datetime,2013/5/1,0) and d <= convert(datetime,'2013/6/24',0)
  15. 进一步转化:
  16. d >= '1901-02-07 00:00:00.000' and d <= 2013-06-24 00:00:00.000
  17. 这样就能查询出结果集。
  18. */
  19. select *
  20. from t
  21. where d between convert(datetime,2013/5/1) and convert(datetime,'2013/6/24')
  22. /*
  23. 2.
  24. 通过查询计划能看出,SQL Server把下面的查询转化成了:
  25. select * from t where d >= convert(datetime,2013/5/1,0) and d <= convert(datetime,2013/6/24,0)
  26. 也就是查询条件:
  27. d >= convert(datetime,2013/5/1,0) and d <= convert(datetime,2013/6/24,0)
  28. 进一步转化:
  29. d >= '1901-02-07 00:00:00.000' and d <= '1900-01-14 00:00:00.000'
  30. 由于SQL Server 把2013/6/24中的斜杠,当成了除号,也就是按除法计算了,
  31. 比如:2013/6/24 就等于13,那么由于datetime默认值是默认值: 1900-01-01 00:00:00,
  32. 那么加上13后,就是1900-01-14 00:00:00.000,这样后就查不出结果了.
  33. */
  34. select *
  35. from t
  36. where 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',一定要加上引号。

发布了416 篇原创文章 · 获赞 135 · 访问量 95万+

在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  2. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  3. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  4. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  6. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  7. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  8. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  9. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. wpf程序,只允许运行一个程序实例问题

    https://bbs.csdn.net/topics/390486402 https://codereview.stackexchange.com/questions/20871/single-in ...

  2. ES6深入浅出-7 新版的类(上集)-1.介绍原型

    ES6新出的关键class BE受雇与网景开发了JS 当我们在写一个对象的时候,我们实际上内存的形式表示. obj等于一个空对象,可以直接toString.它为什么可以有toString window ...

  3. Nginx搭建负载均衡集群

    (1).实验环境 youxi1 192.168.5.101 负载均衡器 youxi2 192.168.5.102 主机1 youxi3 192.168.5.103 主机2 (2).Nginx负载均衡策 ...

  4. Python - Django - ORM 聚合查询和分组查询

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...

  5. Nginx - upstream sent invalid chunked response while reading upstream 异常问题

    一个 post 的请求,直接调接口服务数据正常返回,但是通过 nginx 代理后, 什么都没有返回. nginx 配置如下: 使用 postman 调用,返回如下: 于是检查日志报错信息,如下: ng ...

  6. 数据库分库分表中间件ShardingSphere推荐

    官网链接:http://shardingsphere.io/document/current/cn/overview/ 源起: 我今天首先去了解了一下国内好像是比较火的一个叫"MyCat&q ...

  7. HTML布局排版4三部分测试图片页面

    布局样式有前面的三个相关博文介绍: 该页面因为方便以后自己用,所以JS并没有判断输入内容为空或不对的情况.页面本身特点:1.页头的透明图,方便不更换底层渐变的情况下,更换图片2.浏览器宽度改变,中间b ...

  8. Cas(06)——基于数据库的认证

    基于数据库的认证 目录 1.1      BindModeSearchDatabaseAuthenticationHandler 1.2      QueryDatabaseAuthenticatio ...

  9. windows命令行 共享文件夹

    net share dpantemp2 /DELETEnet share dpantemp2=d:\temp2 /GRANT:jk,FULL /REMARK:" web api 共享&quo ...

  10. 模型-视图-控制器的C++解释

    模型-视图-控制器 (MVC) 并非一种技术,而是软件设计/工程的一个概念.MVC包含三个组成部分,如下图所示 模型 模型直接响应对数据的处理,比如数据库.模型不应依赖其它组成部分,即视图或控制器,换 ...