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:计算排除周日的间隔天数
核心逻辑是:
- 第一个日期的间隔天数固定为0
- 其他日期:计算当前日期与前一个日期的总天数,减去这段时间内的周日数量
完整的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/2018 | 0 |
| 3/25/2018 | 2 |
| 3/29/2018 | 3 |
| 4/20/2018 | 19 |
| 4/22/2018 | 2 |
关键说明
STR_TO_DATE():将你的MM/DD/YYYY格式字符串转换为MySQL标准日期类型LAG():窗口函数,用于获取排序后的上一行数据,这里用来获取前一个日期DATEDIFF():计算两个日期之间的总天数- 周日数量计算:通过日期偏移和整除7的方式,高效统计两个日期区间内的周日总数,避免了逐天遍历的低效操作
内容的提问来源于stack exchange,提问作者Sokea
相关产品推荐
相关产品推荐

