如何将两个日期之间的范围 table 扩展为 SQL 服务器中的新列?
How can I expand a table with a range between two dates as a new column in SQL Server?
我有这个 table 例如:
Start date
End date
value
2022-01-01
2022-01-03
value1
2022-01-02
2022-01-04
value2
我想要的输出是这样的:
Start date
End date
value
Date between
2022-01-01
2022-01-03
value1
2022-01-01
2022-01-01
2022-01-03
value1
2022-01-02
2022-01-01
2022-01-03
value1
2022-01-03
2022-01-02
2022-01-04
value2
2022-01-02
2022-01-02
2022-01-04
value2
2022-01-03
2022-01-02
2022-01-04
value2
2022-01-04
提前致谢!
如前所述,您需要一个日历 table。
这是创建一个的方法
create table calendar (id int identity, cdate date not null)
并像这样填写一次(选择一个足够远的未来结束日期,以及一个足够远的过去的开始日期,这样你就不必再向这个 table 添加行了
;WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT 0 AS I
UNION ALL --startdate enddate
SELECT TOP (DATEDIFF(DAY, '20220101', '20220301'))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3), --up to 1,000 days
Dates AS(
SELECT DATEADD(DAY, T.I, '20220101') AS Date
FROM Tally T)
insert into calendar (cdate)
SELECT D.Date
FROM Dates D
现在您有一个名为 calendar
的 table,您可以在其中加入,现在您需要的查询非常简单
select t.startdate,
t.enddate,
t.value,
c.cdate as datebetween
from mytable t
left join calendar c on c.cdate >= t.startdate
and c.cdate <= t.enddate
我有这个 table 例如:
Start date | End date | value |
---|---|---|
2022-01-01 | 2022-01-03 | value1 |
2022-01-02 | 2022-01-04 | value2 |
我想要的输出是这样的:
Start date | End date | value | Date between |
---|---|---|---|
2022-01-01 | 2022-01-03 | value1 | 2022-01-01 |
2022-01-01 | 2022-01-03 | value1 | 2022-01-02 |
2022-01-01 | 2022-01-03 | value1 | 2022-01-03 |
2022-01-02 | 2022-01-04 | value2 | 2022-01-02 |
2022-01-02 | 2022-01-04 | value2 | 2022-01-03 |
2022-01-02 | 2022-01-04 | value2 | 2022-01-04 |
提前致谢!
如前所述,您需要一个日历 table。
这是创建一个的方法
create table calendar (id int identity, cdate date not null)
并像这样填写一次(选择一个足够远的未来结束日期,以及一个足够远的过去的开始日期,这样你就不必再向这个 table 添加行了
;WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT 0 AS I
UNION ALL --startdate enddate
SELECT TOP (DATEDIFF(DAY, '20220101', '20220301'))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3), --up to 1,000 days
Dates AS(
SELECT DATEADD(DAY, T.I, '20220101') AS Date
FROM Tally T)
insert into calendar (cdate)
SELECT D.Date
FROM Dates D
现在您有一个名为 calendar
的 table,您可以在其中加入,现在您需要的查询非常简单
select t.startdate,
t.enddate,
t.value,
c.cdate as datebetween
from mytable t
left join calendar c on c.cdate >= t.startdate
and c.cdate <= t.enddate