我有一个表格,其中包含这样的行:
Name | date_from | date_to | age
------+------------+------------+-----
Alice | 01.12.2004 | 03.04.2008 | 35
Bob | 04.02.2013 | 04.11.2014 | 43
我想制作一个表格,将每一行分成一年的时间间隔
date_from
和 date_to
列,保留 Name
,并更新 age
,如下所示:
Name | date_from | date_to | age
------+------------+------------+-----
Alice | 01.12.2004 | 01.12.2005 | 35
Alice | 01.12.2005 | 01.12.2006 | 36
Alice | 01.12.2006 | 01.12.2007 | 37
Alice | 01.12.2007 | 01.12.2008 | 38
Alice | 01.12.2008 | 03.04.2008 | 39
Bob | 04.02.2013 | 04.02.2014 | 43
Bob | 04.02.2014 | 04.11.2014 | 44
这可以用 SQL 实现吗?
一个解决方案是生成一个数字列表并将其与原始表格连接起来,将开始日期加上年数直到达到结束日期。
以下查询最多处理 5 年(要支持更多年,您需要使用更多 VALUES
扩展子查询)
SELECT
name,
DATEADD(year, x.n, t.date_from) date_from,
CASE
WHEN DATEADD(year, x.n + 1, t.date_from) > t.date_to
THEN date_to
ELSE DATEADD(year, x.n + 1, t.date_from)
END date_to,
t.age + x.n age
FROM
mytable t
INNER JOIN (
VALUES(0), (1), (2), (3), (4), (5)
) x(n) ON DATEADD(year, x.n, t.date_from) <= t.date_to
ORDER BY name, age
这个 demo on DB Fiddle 您的示例数据返回:
name | date_from | date_to | age
:---- | :------------------ | :------------------ | --:
Alice | 01/12/2004 00:00:00 | 01/12/2005 00:00:00 | 35
Alice | 01/12/2005 00:00:00 | 01/12/2006 00:00:00 | 36
Alice | 01/12/2006 00:00:00 | 01/12/2007 00:00:00 | 37
Alice | 01/12/2007 00:00:00 | 03/04/2008 00:00:00 | 38
Bob | 04/02/2013 00:00:00 | 04/02/2014 00:00:00 | 43
Bob | 04/02/2014 00:00:00 | 04/11/2014 00:00:00 | 44