如何将表中时间区间拆分为30分钟间隔并通过ALTER TABLE实现?
问题描述
我有一张包含以下数据和结构的表:
| Date | Analyst | Start Time | Stop Time |
|---|---|---|---|
| 4/2/2018 | Bill Smith | 7:00 | 10:00 |
我需要将表中的开始时间和结束时间拆分为30分钟的间隔,最终表结构及数据如下:
| Date | Analyst | Start Time | Stop Time |
|---|---|---|---|
| 4/2/2018 | Bill Smith | 7:00 | 7:30 |
| 4/2/2018 | Bill Smith | 7:30 | 8:00 |
| 4/2/2018 | Bill Smith | 8:00 | 8:30 |
| 4/2/2018 | Bill Smith | 8:30 | 9:00 |
| 4/2/2018 | Bill Smith | 9:00 | 9:30 |
| 4/2/2018 | Bill Smith | 9:30 | 10:00 |
请问是否可以通过ALTER TABLE实现该需求?
回答
很明确地说:不行!ALTER TABLE命令的作用仅仅是修改表的结构——比如加列、删列、改字段类型或者调整约束,完全没办法帮你拆分现有数据生成新的行记录。要实现你需要的30分钟间隔拆分,得靠数据查询或者插入的方式,下面给你两种实用的实现思路:
1. 递归CTE方案(适配SQL Server、PostgreSQL等支持递归语法的数据库)
递归CTE可以一步步生成连续的30分钟时间片,再和原表数据关联:
WITH RecursiveIntervals AS ( -- 先取原表的起始时间作为第一个间隔 SELECT Date, Analyst, [Start Time] AS IntervalStart, DATEADD(MINUTE, 30, [Start Time]) AS IntervalEnd FROM YourTableName WHERE DATEADD(MINUTE, 30, [Start Time]) <= [Stop Time] UNION ALL -- 递归生成后续的每一个30分钟间隔 SELECT Date, Analyst, IntervalEnd AS IntervalStart, DATEADD(MINUTE, 30, IntervalEnd) AS IntervalEnd FROM RecursiveIntervals r JOIN YourTableName t ON r.Date = t.Date AND r.Analyst = t.Analyst WHERE DATEADD(MINUTE, 30, r.IntervalEnd) <= t.[Stop Time] ) -- 取出所有递归生成的间隔,再补全最后一个收尾的间隔 SELECT Date, Analyst, IntervalStart AS [Start Time], IntervalEnd AS [Stop Time] FROM RecursiveIntervals UNION ALL SELECT Date, Analyst, DATEADD(MINUTE, -30, [Stop Time]) AS [Start Time], [Stop Time] AS [Stop Time] FROM YourTableName WHERE [Stop Time] > [Start Time] ORDER BY [Start Time];
2. 辅助数字表方案(适配所有主流数据库)
如果你有一张预先建好的辅助表(比如叫Numbers,里面存着从0开始的连续整数),用它来计算间隔会更简单:
SELECT t.Date, t.Analyst, DATEADD(MINUTE, n.Num * 30, t.[Start Time]) AS [Start Time], DATEADD(MINUTE, (n.Num + 1) * 30, t.[Start Time]) AS [Stop Time] FROM YourTableName t JOIN Numbers n ON DATEADD(MINUTE, (n.Num + 1) * 30, t.[Start Time]) <= t.[Stop Time] ORDER BY [Start Time];
补充说明
如果需要把拆分后的数据永久保存,你可以把上面的查询结果插入到一张新表(更建议保留原始数据到新表,避免覆盖),比如用INSERT INTO NewTableName (...) SELECT ...的语法。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

