问题描述:
MySQL在使用between and,日期格式的使用有问题,会发生右边界无法正常使用问题
释义
按常理来说,between and应该是左右包含
结论:
接下来,请大家看下几个例子
表数据(数据类型为datetime)
2025-05-04 15:31:46
2025-04-01 15:31:59
2025-01-04 15:32:15
2025-01-05 00:00:00
语句1
select * from between_test where create_time between '2025-01-01' and '2025-01-04 15:32:15'
结果
2025-01-04 15:32:15
语句2
select * from between_test where create_time between '2025-01-04' and '2025-01-05'
结果
2025-01-04 15:32:15
2025-01-05 00:00:00
语句3
select * from between_test where create_time between '2025-01-05' and '2025-01-05'
结果
2025-01-05 00:00:00
语句4
select * from between_test where create_time between '2025-01-04' and '2025-01-04'
结果
null
从以上4个语句来看,并不是between and 针对日期右边界不包含,只是因为我们只传了日期,而没有传入时间,MySQL自动帮我们转成了datetime格式,而写过日期相关代码的都知道,在转格式时,如果没有任何关于时间时,时间全部默认为0,也就是说左右边界均转为了带0点时间格式的datetime,再进行比较,而我们希望获得的一般都是到23:59:59,这也就导致了我们获取的数据与想象中的不一样。
延伸
语句5
select * from between_test where create_time between '2025-01' and '2025-01'
结果
null
语句6
select * from between_test where create_time between '2025-01' and '2025-01-06'
结果
2025-01-04 15:32:15
2025-01-05 00:00:00
语句7
select * from between_test where create_time between '2025-02' and '2025-02-01'
结果
2025-01-04 15:32:15
2025-01-05 00:00:00
语句8
select * from between_test where create_time between '2025-01-01' and '2025-02'
结果
null
从语句5-8可知,between and无法自动转变格式为年-月的格式,并且如果左边界出问题,MySQL依然可以实现单边<=,但是当右边界出问题时,MySQL就无法识别了
原因的话,猜测应该跟MySQL的底层有关,我未查到相关信息,就不做赘述了,只是描述下现象