SQL Server-需要将日期范围“透视”到单独的记录中

时间:2018-11-29 13:25:25

标签: sql sql-server

我有一张大桌子,上面记录着顾问的工作。我需要获取包含日期范围的每一行数据,并将该行转换为新表中的单独记录。我以一个记录为例。参见下文(英国格式的日期dd / mm / yyyy):

客户名称C_Name客户名称StartDate结束日期

鲍勃·琼斯AcmeHealth 1/2/2018 5/2/2018

转换为...

命名Customer_Name工作日期

鲍勃·琼斯AcmeHealth 1/2/2018
鲍勃·琼斯AcmeHealth 2018年2月2日
鲍勃·琼斯AcmeHealth 2018年3月2日
鲍勃·琼斯AcmeHealth 2018年4月2日
鲍勃·琼斯AcmeHealth 5/2/2018

有什么想法我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果您没有日历或理算表,则可以将CROSS APPLY与临时理算表配合使用。

示例

Select A.C_Name
      ,A.Customer_Name
      ,WorkDate = B.D
 From  YourTable A
 Cross Apply (
                Select Top (DateDiff(DAY,StartDate,EndDate)+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),StartDate) 
                 From  master..spt_values n1,master..spt_values n2
             ) B

返回

C_Name      Customer_Name   WorkDate
Bob Jones   AcmeHealth      2018-02-01
Bob Jones   AcmeHealth      2018-02-02
Bob Jones   AcmeHealth      2018-02-03
Bob Jones   AcmeHealth      2018-02-04
Bob Jones   AcmeHealth      2018-02-05

如果您确实想要格式化日期(属于表示层),则可以进行以下更改:

...
,WorkDate = convert(varchar(10),B.D,101)
...