如何将具有日期范围的行按年份拆分为多行

问题描述 投票:0回答:1

我的简单 SQL 查询的结果

SELECT ID, STARDATE, ENDDATE
FROM A
INNER JOIN B ON A.ID = B.ID
    AND B.CONTRACTID = 572786
WHERE A.ISACTIVE = 1

是:

身份证 星日期 结束日期
394539 2024-03-01 2025-12-31
394540 2026-01-01 2026-12-31

但现在我想按年将结果转换/拆分为三行(期望的结果):

年份 身份证 开始日期 结束日期
2024 394539 2024-03-01 2024-12-31
2025 394539 2025-01-01 2025-12-31
2026 394540 2026-01-01 2026-12-31

有谁可以解释一下如何用 SQL 解决这个问题吗?

尝试在 stackoverflow 上找到解决方案,但找不到任何答案。

sql split date-range group
1个回答
0
投票

我们可以借助日历表来解决您的问题。在这种情况下,日历表可以维护一条记录,其中包含您想要在报告中显示的每一年的开始日期和结束日期。

STARDATE   | ENDDATE
2024-01-01 | 2024-12-31
2025-01-01 | 2025-12-31
2026-01-01 | 2026-12-31

这是您可能使用的查询:

SELECT YEAR(C.STARDATE) AS YEAR, A.ID, A.STARDATE, A.ENDDATE
FROM CALENDAR C
LEFT JOIN A
    ON A.STARDATE <= C.ENDDATE AND A.ENDDATE >= C.STARDATE
INNER JOIN B
    ON B.ID = A.ID
WHERE
    A.ISACTIVE = 1 AND
    B.CONTRACTID = 572786;

请注意,根据您的数据库,它可能没有

YEAR()
函数来从日期中提取年份。我的查询的第一行的语法可能需要更改。

© www.soinside.com 2019 - 2024. All rights reserved.