原文:在论坛中出现的比较难的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. 项目启动时警告 Establishing SSL connection without server's identity verification is not recommended

    项目启动时控制台提示警告: Tue May 14 23:16:10 CST 2019 WARN: Establishing SSL connection without server's identi ...

  2. 网络流中 InputStream.available() = 0 问题探究

    在处理文件输入流时,通过调用available()方法来获取还有多少字节可以读取,根据该数值创建固定大小的byte数组,从而读取输入流的信息. FileInputStream fi = new Fil ...

  3. MQTT基础概念介绍

    https://blog.csdn.net/pipinet123/article/details/60866901 源博客地址:http://blog.csdn.net/pipinet123 MQTT ...

  4. xhr.js:108 Refused to set unsafe header "Cookie"

    https://stackoverflow.com/questions/7210507/ajax-post-error-refused-to-set-unsafe-header-connection/ ...

  5. Java对象为啥要实现Serializable接口

    Serializable接口概述 Serializable是java.io包中定义的.用于实现Java类的序列化操作而提供的一个语义级别的接口.Serializable序列化接口没有任何方法或者字段, ...

  6. MySQL 权限管理 用户管理

    我使用的是 MariaDB 数据库 查看 MySQL 所有用户: select distinct concat('User: \'',user, '\'@\'', host, '\'') as que ...

  7. php nginx window系统 gettext方式实现UTF-8国际化多语言(i18n)

    开始应用: 步骤一:搭建环境(服务器已经完成,环境已经搭建好了) 1.首先查看你的php扩展目录下是否有php_gettext.dll这个文件,如果没有,这就需要你下载一个或是从其他地方拷贝一个,然后 ...

  8. Ubuntu18安装虚拟机virtualbox

    环境查看 安装虚拟机 apt install virtualbox 图形化界面启动 virtualbox 其余创建虚拟机和安装和在Windows安装配置一样,不详述.

  9. SpringBoot学习笔记:单元测试

    SpringBoot学习笔记:单元测试 单元测试 单元测试(英语:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部 ...

  10. C# .NET 判断输入的字符串是否只包含数字和英文字母

    FROM :   https://www.cnblogs.com/ilookbo/p/4828722.html /// <summary> /// 判断输入的字符串是否只包含数字和英文字母 ...