[英]SQL Server : populate table with dates
我正在使用SQL Server。 我有一个挑战性的问题(至少对我来说!)。
我有一张桌子,上面有关于电视节目的信息; 第一列是节目的Title
,第二列是Genre
,第三列是Language
,第四列是节目的首映日期,其格式为: 2017-11-03
。
我想做的是从此首映日期到未来4个月的每一天重复显示一行。 因此,如果当前行显示为2017-11-03
,那么我想针对该范围内的每个日期复制此行,然后对下一个电视节目(下一行)执行相同的操作。
可以用SQL完成吗?
谢谢。
另一个选择是将CROSS APPLY与临时理货表配合使用
这将为源数据中的每个记录生成4个月的数据。
例
Select A.*
,B.D
From YourTable A
Cross Apply (
Select Top (DateDiff(DAY,A.Premier,DateAdd(Month,4,A.Premier))+1)
D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),A.Premier)
From master..spt_values n1
) B
返回
-截断-
用Google搜索它...我爱露西(1951年10月15日首映)应该首先做到这一点。
您可以将日历或日期表用于此类操作。
对于仅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]);
无需采取创建表的实际步骤,您可以在通用表表达式中使用类似的方法,其方法如下:
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)
extrester演示: 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 |
+------------+---------------+---------+----------+---------------+
编号和日历表参考:
最简单的方法是使用数字表。 这是一种构造足够大的方法:
with n as (
select 0 as n union all
select n.n from n where n.n < 50
)
select tv.*, dateadd(week, n.n, tv.premierdate) as showdate
from tvshows tv join
n
on dateadd(week, n.n, tv.premierdate) <= dateadd(month, 4, tv.premierdate);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.