MySQL跨天时段校验:如何判断current time是否落在time_from与time_to字段区间
跨天调度时段匹配的MySQL实现
核心问题说明
原判断逻辑存在两个问题:
- 引用的
time_from_1、time_to_1属于笔误,实际应为表中原始字段time_from、time_to - 仅适配非跨天时段(即
time_from < time_to的情况),采用「time_from<= 当前小时 <=time_to」的固定判断。对于跨天时段(如23点到次日1点,对应存储值time_from=23、time_to=1),由于time_to数值小于time_from,固定判断条件无法命中。
实现逻辑
- 首先将表中存储的
varchar类型小时值转换为无符号整数,避免字符串比较的逻辑错误(如字符串比较时'9' > '10'的异常) - 使用MySQL内置函数
HOUR(NOW())直接获取当前24小时制的小时数值,与存储格式完全匹配 - 按是否跨天分两类场景判断:
- 非跨天场景:
time_from < time_to,当前小时需处于[time_from, time_to]闭区间内 - 跨天场景:
time_from > time_to,当前小时要么大于等于time_from(当天夜间时段),要么小于等于time_to(次日凌晨时段)
- 非跨天场景:
完整查询SQL
SELECT * FROM `ace_rp_inventory_locations_night` WHERE -- 非跨天时段匹配逻辑 ( CAST(time_from AS UNSIGNED) < CAST(time_to AS UNSIGNED) AND HOUR(NOW()) BETWEEN CAST(time_from AS UNSIGNED) AND CAST(time_to AS UNSIGNED) ) OR -- 跨天时段匹配逻辑 ( CAST(time_from AS UNSIGNED) > CAST(time_to AS UNSIGNED) AND ( HOUR(NOW()) >= CAST(time_from AS UNSIGNED) OR HOUR(NOW()) <= CAST(time_to AS UNSIGNED) ) );
边界效果说明(针对表中time_from=23、time_to=1的测试数据)
- 当前小时为23:满足跨天场景的
>=23条件,可命中记录 - 当前小时为0、1:满足跨天场景的
<=1条件,可命中记录 - 当前小时为2:既不满足
>=23也不满足<=1,不会命中记录,符合时段设计预期
补充说明:如果存在
time_from = time_to的配置(代表当前时段全天覆盖),可在WHERE条件中追加匹配规则:OR CAST(time_from AS UNSIGNED) = CAST(time_to AS UNSIGNED)
内容的提问来源于stack exchange,提问作者apoorv kanungo
相关产品推荐
相关产品推荐

