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

MySQL中在同一行显示上一条和下一条日期值的实现方法

解决MySQL查询中显示上一条记录日期的问题

嘿,我来帮你搞定这个需求!你想要在同一行里同时展示当前更新的日期和上一条的更新日期,核心是要基于intUpdateOrder的顺序来关联前后记录对吧?你的原查询用了GROUP_CONCAT,这其实不太适合这个场景,咱们换个更精准的方法:

方案1:MySQL 8.0+ 用窗口函数 LAG()

从MySQL 8.0开始支持窗口函数,LAG()可以直接获取同一分组中前一行的数据,完美匹配你的需求。这里我们按intUpdateOrder的顺序来排序,获取前一条的dateLeave作为上一条日期:

SELECT
    intDateId,
    dateLeave AS dateCurrentUpdate,
    -- 获取按intUpdateOrder排序的前一行的dateLeave
    LAG(dateLeave) OVER (ORDER BY intUpdateOrder) AS datePrevious,
    intUpdateOrder
FROM leave_date
WHERE intUpdateOrder IS NOT NULL -- 只筛选有更新顺序的记录,根据需求可调整
ORDER BY intUpdateOrder;

执行结果:

intDateIddateCurrentUpdatedatePreviousintUpdateOrder
32018-04-11NULL1
42018-04-202018-04-112

解释:LAG()函数会按照ORDER BY intUpdateOrder的顺序,为每一行返回前一行的dateLeave值,第一行因为没有前一行,所以datePrevious是NULL。

方案2:MySQL 5.x 版本(无窗口函数)

如果你的MySQL版本低于8.0,不支持窗口函数,可以用自连接的方式来实现:

SELECT
    t1.intDateId,
    t1.dateLeave AS dateCurrentUpdate,
    t2.dateLeave AS datePrevious,
    t1.intUpdateOrder
FROM leave_date t1
LEFT JOIN leave_date t2 
    ON t1.intUpdateOrder = t2.intUpdateOrder + 1
WHERE t1.intUpdateOrder IS NOT NULL
ORDER BY t1.intUpdateOrder;

这个思路是把表自己和自己关联,让当前行的intUpdateOrder等于上一行的intUpdateOrder +1,从而匹配到前一条记录。执行结果和上面的方案1完全一致。

关于初始记录(intUpdateOrder为NULL)

如果需要把那些intUpdateOrder为NULL的初始记录也包含进来,只需要去掉WHERE条件即可,不过这些记录因为没有更新顺序,datePrevious会是NULL,这符合逻辑。

内容的提问来源于stack exchange,提问作者Andhika R.K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:15:43