MySQL跨天时间段查询:整数格式时间如何获取对应值?
解决跨天时间段查询问题
不用必须将列改为时间格式,通过调整查询逻辑就能实现需求。
问题原因
你之前的BETWEEN语句失效,是因为跨天时段的start(比如2216)数值大于end(比如100),而00:02对应的整数是2,既不满足2 BETWEEN 2216 AND 100(因为BETWEEN会默认判断值是否在较小数和较大数之间),所以匹配失败。
基于整数的解决方案
直接通过逻辑分支处理两种时段情况:
- 非跨天时段(
start ≤ end):目标时间在start和end之间 - 跨天时段(
start > end):目标时间要么≥start(当天晚段),要么≤end(次日早段)
针对00:02(对应整数2)的查询语句如下:
SELECT value FROM your_table WHERE (start <= end AND 2 BETWEEN start AND end) OR (start > end AND (2 >= start OR 2 <= end));
注意将your_table替换为你实际的表名,查询其他时间时,只需把2换成对应整数(比如01:30对应130,22:16对应2216)。
可选:转换为时间格式的方案
如果后续有更多时间相关操作,转换成时间类型会更灵活。以MySQL为例,先把整数转成时间格式,跨天时段给end加上24小时再判断:
SELECT value FROM your_table WHERE CASE WHEN STR_TO_DATE(LPAD(start,4,'0'), '%H%i') > STR_TO_DATE(LPAD(end,4,'0'), '%H%i') THEN STR_TO_DATE('0002', '%H%i') BETWEEN STR_TO_DATE(LPAD(start,4,'0'), '%H%i') AND STR_TO_DATE(LPAD(end,4,'0'), '%H%i') + INTERVAL 24 HOUR ELSE STR_TO_DATE('0002', '%H%i') BETWEEN STR_TO_DATE(LPAD(start,4,'0'), '%H%i') AND STR_TO_DATE(LPAD(end,4,'0'), '%H%i') END;
不同数据库的时间转换语法有差异,比如PostgreSQL可使用TO_TIMESTAMP函数,需根据实际数据库调整。
内容的提问来源于stack exchange,提问作者nickko
相关产品推荐
相关产品推荐

