You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 11:45:03