我的简单 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 上找到解决方案,但找不到任何答案。
我们可以借助日历表来解决您的问题。在这种情况下,日历表可以维护一条记录,其中包含您想要在报告中显示的每一年的开始日期和结束日期。
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()
函数来从日期中提取年份。我的查询的第一行的语法可能需要更改。