MySql-between and边界

181 阅读2分钟

问题描述:

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的底层有关,我未查到相关信息,就不做赘述了,只是描述下现象