如何使用MySQL将指定日期范围分割为3天单位的连续时间块
3天时间块分割SQL实现方案
实现逻辑
通过递归CTE生成连续的3天时间块,自动过滤不足3天的剩余区间,兼容MySQL 8.0+、PostgreSQL、SQL Server等支持递归公共表表达式的主流数据库。
假设你的原始表名为user_date_range,SQL实现代码如下:
WITH RECURSIVE date_blocks AS ( -- 生成第一个3天时间块 SELECT User, `Minimum Date` AS block_min, DATE_ADD(`Minimum Date`, INTERVAL 2 DAY) AS block_max, `Maximum Date` AS user_max_date FROM user_date_range UNION ALL -- 递归生成后续所有符合要求的3天块 SELECT User, DATE_ADD(block_max, INTERVAL 1 DAY) AS block_min, DATE_ADD(block_max, INTERVAL 3 DAY) AS block_max, user_max_date FROM date_blocks WHERE DATE_ADD(block_max, INTERVAL 3 DAY) <= user_max_date ) -- 格式化日期输出,和示例格式对齐 SELECT User, DATE_FORMAT(block_min, '%m/%d/%Y') AS `Minimum Date`, DATE_FORMAT(block_max, '%m/%d/%Y') AS `Maximum Date` FROM date_blocks ORDER BY User, block_min;
语法适配说明
不同数据库的日期函数略有差异,对应调整即可:
- SQL Server:将
DATE_ADD替换为DATEADD,字段引用用方括号包裹,比如[Minimum Date] - PostgreSQL:日期加减直接写
"Minimum Date" + INTERVAL '2 days',日期格式化用TO_CHAR(block_min, 'MM/DD/YYYY')
内容的提问来源于stack exchange,提问作者TryingToLearn97
相关产品推荐
相关产品推荐

