我的表某个字段是Datetime型 以" YYYY-MM-DD 00:00:00" 存放
如
A 2009-01-22 21:22:22
B 2009-01-22 19:21:11
C 2009-01-22 23:10:22
时间范围查找
现在想从table1查找’2021-01-12’ 到 ‘2021-01-25’ 的数据,要求包含12日全天和26日全天的数据,
现在用
select id, gmt_create from table1 where gmt_create between '2021-01-12' and '2021-01-25';
查出来的数据包含12日全天到25日全天的数据,但没有25的任何数据。
是因为:
SQL中 between and是包括边界值的,not between不包括边界值,不过如果使用between and 限定日期需要注意,between里面的范围日期格式为 ‘2021-01-12’ ,sql 默认会在后面加上’00:00:00’ , 最后的格式为 ‘2021-01-12 00:00:00’, 所以between ‘2021-01-12’ and ‘2021-01-26’, 转化为 ‘2021-01-12 00:00:00’ and ‘2021-01-25 00:00:00’ ,即gmt_create > ‘2021-01-12 00:00:00’ and gmt_create < ‘2021-01-25 00:00:00’ ,是不包含25日全天的时间的
所有如果想从table1查找’2021-01-12’ 到 ‘2021-01-26’ 的数据,要求包含12日全天和25日全天的数据,就要写成between ‘2021-01-12’ and ‘2021-01-26’, 这是从’2021-01-12 00:00:00’ 查到’2021-01-26 00:00:00’,就包含了25日全天的数据。
以下sql等价
select id, gmt_create from table1 where gmt_create > '2021-01-12' and gmt_create < '2021-01-26';
select id, gmt_create from table1 where gmt_create > '2021-01-12 00:00:00' and gmt_create < '2021-01-26 00:00:00';
#上面的两中写法不会包含'2021-01-22 00:00:00'这一刻的数据,如果想包含可以这么写:
select id, gmt_create from table1 where gmt_create > '2021-01-12 00:00:00' and gmt_create < '2021-01-26 00:00:00' or gmt_create = '2021-01-12 00:00:00';
##---------------------------------------------------------------------------##
select id, gmt_create from table1 where gmt_create between '2021-01-12' and '2021-01-26';
select id, gmt_create from table1 where gmt_create between '2021-01-12 00:00:00' and '2021-01-26 00:00:00';
#上面的between写法会包含'2021-01-26 00:00:00'这一刻的数据,
查某一天的数据
如果写成
select id, gmt_create from table1 where gmt_create between '2021-01-12' and '2021-01-12';
只能查出2021-01-12 00:00:00 这一刻的数据
需要写成
select id, gmt_create from table1 where gmt_create between '2021-01-12 00:00:00' and '2021-01-12 23:59:59';
或者写成这样更精确
select id, gmt_create from crowd_analysis_cache where gmt_create > '2021-01-12 00:00:00' and gmt_create < '2021-01-13 00:00:00' or gmt_create = '2021-01-12 00:00:00';