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

MySQL实现按当前时间后5/10/15小时区间计算数量的SQL查询

MySQL查询:计算指定未来区间的折算总数量

假设你的表名为interval_data,以下查询可以计算当前时间到未来5小时、10小时、15小时三个区间内的折算总数量,自动处理完全重叠、部分重叠和无重叠的情况:

SELECT
  '0-5小时' AS target_interval,
  SUM(
    CASE
      WHEN MAX(interval_start, NOW()) < MIN(interval_end, DATE_ADD(NOW(), INTERVAL 5 HOUR)) THEN
        Qty * TIMESTAMPDIFF(MINUTE, MAX(interval_start, NOW()), MIN(interval_end, DATE_ADD(NOW(), INTERVAL 5 HOUR))) / time_diff_Min
      ELSE 0
    END
  ) AS total_qty
FROM interval_data
UNION ALL
SELECT
  '5-10小时' AS target_interval,
  SUM(
    CASE
      WHEN MAX(interval_start, DATE_ADD(NOW(), INTERVAL 5 HOUR)) < MIN(interval_end, DATE_ADD(NOW(), INTERVAL 10 HOUR)) THEN
        Qty * TIMESTAMPDIFF(MINUTE, MAX(interval_start, DATE_ADD(NOW(), INTERVAL 5 HOUR)), MIN(interval_end, DATE_ADD(NOW(), INTERVAL 10 HOUR))) / time_diff_Min
      ELSE 0
    END
  ) AS total_qty
FROM interval_data
UNION ALL
SELECT
  '10-15小时' AS target_interval,
  SUM(
    CASE
      WHEN MAX(interval_start, DATE_ADD(NOW(), INTERVAL 10 HOUR)) < MIN(interval_end, DATE_ADD(NOW(), INTERVAL 15 HOUR)) THEN
        Qty * TIMESTAMPDIFF(MINUTE, MAX(interval_start, DATE_ADD(NOW(), INTERVAL 10 HOUR)), MIN(interval_end, DATE_ADD(NOW(), INTERVAL 15 HOUR))) / time_diff_Min
      ELSE 0
    END
  ) AS total_qty
FROM interval_data;

关键逻辑说明

  • 重叠区间计算:用MAX(原区间开始时间, 目标区间开始时间)得到重叠部分的起始点,MIN(原区间结束时间, 目标区间结束时间)得到重叠部分的终点。只有当起始点早于终点时,才存在有效重叠。
  • 折算数量:通过重叠分钟数 / 原区间总分钟数(time_diff_Min)得到占比,再乘以原数量Qty,得到该记录在目标区间的贡献值。
  • 无重叠处理:如果原区间和目标区间没有重叠(起始点≥终点),则贡献值为0,不纳入总和。

示例验证

比如当前时间为12:00PM时:

  • 对于原区间覆盖11:00-13:30(time_diff_Min=150)、Qty=4556的记录,目标区间12:00-17:00的重叠时间是30分钟,折算数量为4556*30/150=911.2
  • 对于原区间覆盖16:00-18:00(time_diff_Min=120)、Qty=3645的记录,重叠时间是60分钟,折算数量为3645*60/120=1822.5
  • 完全落在目标区间内的记录,折算数量为其全部Qty值

最终将所有有效贡献值求和,得到对应区间的总数量。

内容的提问来源于stack exchange,提问作者user2847638

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:35:27