我有一张大桌子,上面记录着顾问的工作。我需要获取包含日期范围的每一行数据,并将该行转换为新表中的单独记录。我以一个记录为例。参见下文(英国格式的日期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
有什么想法我该怎么做?
答案 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)
...