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

MySQL中如何对日期列表排除周日计算相邻日期间隔天数

解决方案

要实现你需要的相邻日期排除周日的间隔天数计算,可以按照以下步骤在MySQL中操作:

步骤1:构造日期数据集

首先把你提供的日期字符串转换为MySQL可识别的DATE类型,确保后续计算准确:

WITH date_dataset AS (
    -- 这里是你的原始日期列表,用UNION ALL拼接
    SELECT STR_TO_DATE('3/23/2018', '%m/%d/%Y') AS target_date UNION ALL
    SELECT STR_TO_DATE('3/25/2018', '%m/%d/%Y') UNION ALL
    SELECT STR_TO_DATE('3/29/2018', '%m/%d/%Y') UNION ALL
    SELECT STR_TO_DATE('4/20/2018', '%m/%d/%Y') UNION ALL
    SELECT STR_TO_DATE('4/22/2018', '%m/%d/%Y')
)

步骤2:获取相邻的前一个日期

使用LAG()窗口函数,按日期升序排列,为每个日期获取它的前一个日期(第一个日期没有前一个,所以为NULL):

, ordered_dates AS (
    SELECT
        target_date,
        -- 按日期排序,获取上一行的日期
        LAG(target_date) OVER (ORDER BY target_date) AS prev_date
    FROM date_dataset
)

步骤3:计算排除周日的间隔天数

核心逻辑是:

  1. 第一个日期的间隔天数固定为0
  2. 其他日期:计算当前日期与前一个日期的总天数,减去这段时间内的周日数量

完整的SQL语句如下:

WITH date_dataset AS (
    SELECT STR_TO_DATE('3/23/2018', '%m/%d/%Y') AS target_date UNION ALL
    SELECT STR_TO_DATE('3/25/2018', '%m/%d/%Y') UNION ALL
    SELECT STR_TO_DATE('3/29/2018', '%m/%d/%Y') UNION ALL
    SELECT STR_TO_DATE('4/20/2018', '%m/%d/%Y') UNION ALL
    SELECT STR_TO_DATE('4/22/2018', '%m/%d/%Y')
), ordered_dates AS (
    SELECT
        target_date,
        LAG(target_date) OVER (ORDER BY target_date) AS prev_date
    FROM date_dataset
)
SELECT
    DATE_FORMAT(target_date, '%m/%d/%Y') AS `日期列表`,
    CASE
        -- 第一个日期没有前一个日期,间隔天数为0
        WHEN prev_date IS NULL THEN 0
        ELSE
            -- 总天数减去这段时间内的周日数量
            DATEDIFF(target_date, prev_date)
            - (
                -- 计算prev_date到target_date之间的周日总数
                FLOOR((target_date - INTERVAL (WEEKDAY(target_date) + 1) DAY) / 7)
                - FLOOR((prev_date - INTERVAL (WEEKDAY(prev_date) + 1) DAY) / 7)
            )
    END AS `间隔天数`
FROM ordered_dates
ORDER BY target_date;

验证结果

执行上述SQL后,你会得到和预期一致的结果:

日期列表间隔天数
3/23/20180
3/25/20182
3/29/20183
4/20/201819
4/22/20182

关键说明

  • STR_TO_DATE():将你的MM/DD/YYYY格式字符串转换为MySQL标准日期类型
  • LAG():窗口函数,用于获取排序后的上一行数据,这里用来获取前一个日期
  • DATEDIFF():计算两个日期之间的总天数
  • 周日数量计算:通过日期偏移和整除7的方式,高效统计两个日期区间内的周日总数,避免了逐天遍历的低效操作

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

相关产品推荐
方舟 Agent Plan

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

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