如何通过SQL展示重复会议的所有重复日期记录?
实现重复会议日期的逐条展示
要实现将重复会议的所有日期逐条列出,核心是生成事件起始到结束日期之间的所有日期序列,再与原表关联展开每条记录。以下针对主流数据库给出实现方案:
前提说明
假设EventType字段用于标记重复类型(例如'Daily'代表每日重复),如果没有该字段,可根据EventName筛选重复事件(比如筛选EventName = 'Daily scrum')。
1. PostgreSQL 实现
利用generate_series生成日期序列,直接关联原表展开:
SELECT 'Event: ' || e.EventName AS event_line, 'Date: ' || TO_CHAR(series_date, 'FMDDth Mon YYYY, HH12am') AS date_line FROM Events e CROSS JOIN generate_series( DATE_TRUNC('day', e.EventStart), DATE_TRUNC('day', e.EventEnd), INTERVAL '1 day' ) AS series_date WHERE e.EventType = 'Daily' -- 筛选每日重复事件 AND e.EventName = 'Daily scrum' -- 可选:指定特定事件 ORDER BY series_date;
2. SQL Server 实现
使用递归CTE生成日期序列:
WITH DateSeries AS ( SELECT e.EventId, e.EventName, CAST(e.EventStart AS DATE) AS series_date, e.EventEnd FROM Events e WHERE e.EventType = 'Daily' AND e.EventName = 'Daily scrum' UNION ALL SELECT ds.EventId, ds.EventName, DATEADD(DAY, 1, ds.series_date), ds.EventEnd FROM DateSeries ds WHERE ds.series_date < CAST(ds.EventEnd AS DATE) ) SELECT 'Event: ' + EventName AS event_line, 'Date: ' + FORMAT(series_date, 'd\th MMM yyyy, hhtt') AS date_line FROM DateSeries ORDER BY series_date OPTION (MAXRECURSION 0); -- 解除递归深度限制(如果日期跨度大)
3. MySQL 实现
使用递归CTE(MySQL 8.0+支持):
WITH RECURSIVE DateSeries AS ( SELECT EventId, EventName, DATE(EventStart) AS series_date, EventEnd FROM Events WHERE EventType = 'Daily' AND EventName = 'Daily scrum' UNION ALL SELECT EventId, EventName, DATE_ADD(series_date, INTERVAL 1 DAY), EventEnd FROM DateSeries WHERE series_date < DATE(EventEnd) ) SELECT CONCAT('Event: ', EventName) AS event_line, CONCAT( 'Date: ', DATE_FORMAT(series_date, '%D %b %Y, %h%p') ) AS date_line FROM DateSeries ORDER BY series_date;
输出说明
以上查询会生成与你预期格式一致的结果,每条事件日期占两行(Event行和Date行),不同记录间的空行可通过客户端工具设置格式,或在查询中通过UNION ALL额外添加空行记录(需注意排序逻辑)。
内容的提问来源于stack exchange,提问作者Aj Andrew
相关产品推荐
相关产品推荐

