以下是本人使用中遇到的一些坑,会陆陆续续收集更新,主要目的是希望能帮助到有缘人了,文笔不高,大白话介绍手把手解决问题。如有问题或想法请指出,不胜感激!!!
3.在使用日期作为范围条件查找时数据缺失问题
先说下场景问题,比如我要查询2020年8月1号到8月10号的数据 表的数据结构以及数据如下
![](https://img.haomeiwen.com/i14980830/ced771f73d24691c.png)
![](https://img.haomeiwen.com/i14980830/16fde8f60b9312ac.png)
表结构很简单不复杂字段也不多,其中create_time字段是varchar类型的 time是datetime类型的 这点要注意!下面sql查询如下:
![](https://img.haomeiwen.com/i14980830/079bd37afa4b4983.png)
what?查询的结果很是诡异,竟然不包括2020-08-01的数据怎么回事?有两点要提前说明一下,第一点是我现在目前查询的字段是create_time 是varchar类型的,另外一点,为什么我查询的条件中使用 2020-08-01 00:00:00 +0800 CST 的格式去查询,因为在写代码时传参传入的是时间类型,而不是字符串,踩到了坑所以才诞生此文章写下该问题。 仔细观察发现我查询的条件中时间是 2020-08-01 00:00:00 +0800 CST 格式的,而实际库中的是2020-08-01 难道是不匹配的缘故?于是我稍加修改查询如下结果如下:
![](https://img.haomeiwen.com/i14980830/1bb887cbd979b55d.png)
这回发现结果正常了8月1号的数据有了,但是为什么呢?原理呢?此处暂时不清楚还是挖个坑待补充。
以上是使用between的查询,可能你此时你会想到 >= <=的情况是什么样子的呢? 其实也是和上面一样的,以下简略概括如下:
![](https://img.haomeiwen.com/i14980830/3663e2d1a9ac7acd.png)
![](https://img.haomeiwen.com/i14980830/a749f24789b832b8.png)
ok上文已经演示了varchar类型作为时间用between 和 >= <=进行查找的问题,此时你可能又会想到datetime 或者timestamp 或者date查询是如何呢?下面演示datetime查询方式,此时我们要关注time字段类型,如下:
![](https://img.haomeiwen.com/i14980830/c6136ff267a9a7fa.png)
![](https://img.haomeiwen.com/i14980830/c9e8fd59d6952da7.png)
我们发现此时查询datetime 类型的time字段是没有问题的 结果二中的查询条件去掉了 时分秒时区查询也是没问题的。
以上是between的查询情况,下面同样在演示>= <=的查询情况
![](https://img.haomeiwen.com/i14980830/b5590408cf89f588.png)
![](https://img.haomeiwen.com/i14980830/aeaa8e656184b387.png)
同样和between的结果是一样的。
到这本问题基本上演示完了,其中date 和timestamp的类型就不在演示了,有兴趣可自测一下。另外要说一点between的取值范围是包含条件值的 比如查找数据8号0点到10号0点的数据其中包含8号0点和10号0点的数据 sql代码 条件如下:
SELECT * FROM 表名 WHERE time BETWEEN '2020-08-01 00:00:00 +0800 CST' AND '2020-08-10 00:00:00 +0800 CST';
也等价于
SELECT * FROM 表名 WHERE time >='2020-08-01 00:00:00 +0800 CST' AND time <='2020-08-10 00:00:00 +0800 CST';
用数学集合闭区间来表示如下:
[2020-08-01 00:00:00 +0800 CST,2020-08-10 00:00:00 +0800 CST]
网友评论