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

如何计算前序ID的endTime与后序ID的startTime的时间差?

计算相邻预约记录的时间间隔

原始数据表

booking表的初始数据:

id   startTime            endTime 
1    2022-12-3 13:00:00   2022-12-3 14:00:00
2    2022-12-3 14:00:00   2022-12-3 14:30:00
3    2022-12-3 15:00:00   2022-12-3 15:15:00 
4    2022-12-3 15:30:00   2022-12-3 16:30:00
5    2022-12-3 18:30:00   2022-12-3 19:00:00

已实现的单条记录时间差计算

你已经实现了计算单条记录内startTime与endTime的差值(判断是否为60分钟),对应的SQL语句:

SELECT startTime, endTime, 
(TIMESTAMPDIFF(MINUTE, startTime , endTime) = '60') AS MinuteDiff 
FROM booking

执行后的输出:

id   startTime            endTime             MinuteDiff
1    2022-12-3 13:00:00   2022-12-3 14:00:00  1
2    2022-12-3 14:00:00   2022-12-3 14:30:00  0
3    2022-12-3 15:00:00   2022-12-3 15:15:00  0
4    2022-12-3 15:30:00   2022-12-3 16:30:00  1
5    2022-12-3 18:30:00   2022-12-3 19:00:00  0

问题需求

已实现单条ID记录的startTime与endTime差值计算,现在需要计算相邻ID间,前一条记录的endTime与后一条记录的startTime的时间差(比如ID1的endTime和ID2的startTime的差值)。

解决方案

使用MySQL的**窗口函数LAG()**可以轻松实现这个需求,LAG()用于获取当前行的前一行指定字段的值,结合TIMESTAMPDIFF()计算时间差。

完整SQL语句

SELECT 
    id,
    startTime,
    endTime,
    -- 获取上一条记录的endTime
    LAG(endTime) OVER (ORDER BY id) AS prev_endTime,
    -- 计算前一条endTime到当前startTime的分钟差
    TIMESTAMPDIFF(MINUTE, LAG(endTime) OVER (ORDER BY id), startTime) AS adjacent_minute_diff
FROM booking
ORDER BY id;

执行结果

id   startTime            endTime             prev_endTime          adjacent_minute_diff
1    2022-12-3 13:00:00   2022-12-3 14:00:00  NULL                  NULL
2    2022-12-3 14:00:00   2022-12-3 14:30:00  2022-12-3 14:00:00    0
3    2022-12-3 15:00:00   2022-12-3 15:15:00  2022-12-3 14:30:00    30
4    2022-12-3 15:30:00   2022-12-3 16:30:00  2022-12-3 15:15:00    15
5    2022-12-3 18:30:00   2022-12-3 19:00:00  2022-12-3 16:30:00    120

说明

  • LAG(endTime) OVER (ORDER BY id):按照id排序,获取当前行的前一行的endTime,第一条记录没有前一行,所以该字段值为NULL
  • TIMESTAMPDIFF(MINUTE, ...):以分钟为单位计算时间差,第一条记录因无前一条数据,差值为NULL

可选:排除无前置记录的第一条数据

如果不需要展示第一条记录,可以添加WHERE条件过滤:

SELECT 
    id,
    startTime,
    endTime,
    LAG(endTime) OVER (ORDER BY id) AS prev_endTime,
    TIMESTAMPDIFF(MINUTE, LAG(endTime) OVER (ORDER BY id), startTime) AS adjacent_minute_diff
FROM booking
WHERE LAG(endTime) OVER (ORDER BY id) IS NOT NULL
ORDER BY id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:30:49