繁体   English   中英

SQL Server:用日期填充表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM