您可以使用日历或日期表来处理这类事情。
内存中只有 152kb,您可以在一个表中包含 30 年的日期:
/* dates table */
declare @fromdate date = '20000101';
declare @years int = 30;
/* 30 years, 19 used data pages ~152kb in memory, ~264kb on disk */
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n))
select top (datediff(day, @fromdate,dateadd(year,@years,@fromdate)))
[Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate))
into dbo.Dates
from n as deka cross join n as hecto cross join n as kilo
cross join n as tenK cross join n as hundredK
order by [Date];
create unique clustered index ix_dbo_Dates_date
on dbo.Dates([Date]);
无需执行创建表的实际步骤,您可以在 common table expression 中使用类似的方法,只需这样做:
declare @fromdate date = '20170101';
declare @years int = 4;
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n))
, dates as (
select top (datediff(day, @fromdate,dateadd(year,@years,@fromdate)))
[Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate))
from n as deka cross join n as hecto cross join n as kilo
cross join n as tenK cross join n as hundredK
order by [Date]
)
像这样使用:
select d.date, t.*
from dates d
inner join tv_shows t
on d.date >= t.premiere_date
and d.date <= dateadd(month,4,t.premiere_date)
rextester 演示:http://rextester.com/XSRG45354
返回:
+------------+-------+---------+----------+---------------+
| date | title | genre | language | premiere_date |
+------------+-------+---------+----------+---------------+
| 2017-11-03 | one | example | english | 2017-11-03 |
| 2017-11-04 | one | example | english | 2017-11-03 |
| 2017-11-05 | one | example | english | 2017-11-03 |
| 2017-11-06 | one | example | english | 2017-11-03 |
....
| 2018-02-28 | one | example | english | 2017-11-03 |
| 2018-03-01 | one | example | english | 2017-11-03 |
| 2018-03-02 | one | example | english | 2017-11-03 |
| 2018-03-03 | one | example | english | 2017-11-03 |
+------------+---------------+---------+----------+---------------+
数字和日历表参考: