sql - 对于两个日期之间的每个季度,在 SQL SERVER 中逐季度添加行
问题描述
我有一个表,类型为 int、datetime、datetime:
id start date end date
-- ---------- ----------
1 2019-04-02 2020-09-17
2 2019-08-10 2020-08-10
这是创建/插入:
CREATE TABLE dbo.something
(
id int,
[start date] datetime,
[end date] datetime
);
INSERT dbo.something(id,[start date],[end date])
VALUES(1,'20190402','20200917'),(2,'20190810','20200810');
什么是可以产生这些结果的 SQL 查询:
id Year Quarter
-- ---- ----------
1 2019 2
1 2019 3
1 2019 4
1 2020 1
1 2020 2
1 2020 3
2 2019 3
2 2019 4
2 2020 1
2 2020 2
2 2020 3
解决方案
只需使用递归 CTE。此版本从第 0 年切换到计算季度:
with cte as (
select id,
year(start_date) * 4 + datepart(quarter, start_date) - 1 as yyyyq,
year(end_date) * 4 + datepart(quarter, end_date) - 1 as end_yyyyq
from t
union all
select id, yyyyq + 1, end_yyyyq
from cte
where yyyyq < end_yyyyq
)
select id, yyyyq / 4 as year, (yyyyq % 4) + 1 as quarter
from cte;
这是一个 db<>fiddle。
推荐阅读
- excel - 统计所有在“特定月份”注册但在“其他月份”转换的人
- tfs - 将测试用例导出到电子邮件看到错误“:”字符,十六进制值 0x3A,不能包含在名称中
- microsoft-graph-api - Microsoft graph API - 订阅任何日历时出现未经授权的错误
- intellij-idea - 如何在 intellij 文件观察器中调试 sass。找不到输出窗口
- sql - 删除保留最新记录的重复记录
- android - 如何为 Android 启用内部应用程序共享?
- excel - Excel 文本仅识别月份
- ruby-on-rails - 以活动记录/ arel DB 不可知的方式编写以下 sql
- django-filter - 如何过滤石墨烯-django中为空的石墨烯标量场?
- c# - 运行日历时找不到表 0