我有两张桌子:
日历 - 包含所有日期的维度表。
create table #orders
(
order_id int identity(1,1) primary key
,start_date date
,end_date date
)
insert into #orders
(
start_date
,end_date
)values('2018-01-05','2019-02-04'),('2018-03-15','2019-07-14')
create table #calendar_dates
(
[date] date
)
;WITH calendar
AS (SELECT dates = CONVERT(date, '2018-01-01' )
UNION ALL
SELECT dates = Dateadd(DAY, 1, dates)
FROM calendar
WHERE dates < ='2020-12-31'
)
insert into #calendar_dates
(
date
)
select
c.dates
from
calendar c
OPTION( MAXRECURSION 0)
select * from #orders
select * from #calendar_dates
对于每个订单,如果日历日期超过该日期,我需要使用指示符表示已完成的月份来掩盖额外的列。
例如:输出应如下所示:
calendar_date order_id start_date end_date is_month
-------------------------------------------------------------------------
2018-01-01 1 2018-01-01 2019-02-04 1
2018-01-02 1 2018-01-01 2019-02-04 0
2018-01-03 1 2018-01-01 2019-02-04 0
.
.
.
.
.
.
.
2018-02-01 1 2018-01-01 2019-02-04 1
.
.
2018-03-01 1 2018-01-01 2019-02-04 1
.
.
2018-04-01 1 2018-01-01 2019-02-04 1
.
.
2018-05-01 1 2018-01-01 2019-02-04 1
答案 0 :(得分:2)
您是否需要为每个订单标记每个月的开头?
SELECT
T.date,
O.order_id,
O.start_date,
O.end_date,
is_month = CASE WHEN DATEPART(DAY, T.date) = 1 THEN 1 ELSE 0 END
FROM
#calendar_dates AS T
INNER JOIN #orders AS O ON T.date BETWEEN O.start_date AND O.end_date
ORDER BY
O.order_id,
T.date