如何基于monthStartDate
和MonthEndDate
在同一个表中多次复制表记录,假设我的表只包含一行monthStartDate
和{{ 1}}。月份开始日期为MonthEndDate
,01-Jan-2018
为MonthendDate
,现在我想将此一条记录复制到31次。
下面是表格结构。
tbl_Employee
31-jan-2018
现在我期待以下输出。
EmployeeID Name TeamManagerEmpID TeamManagerName OpsManagerID OpsManagerName Department FromDate ToDate
210000 Peter Anderson 110000 Alex Broad 100000 Steve Anderson BI 01-Jan 31-Jan
210000 Peter Anderson 110001 Smith Jones 100000 Steve Anderson BI 01-Feb 31-Mar
你能帮帮我吗。
答案 0 :(得分:0)
首先,您需要为FromDate和ToDate定义正确的DATE数据类型。然后,您应该有一个单独的日期表,用于生成FromDate和ToDate之间的日期。我在下面给出了示例代码供您参考。
CREATE TABLE #employee
(
empid int,
empname varchar(30),
empStartDate datetime,
empEndDate datetime);
CREATE TABLE #dimdate
(
datevalue datetime
);
INSERT INTO #employee
values(1,'venkat','20180101','20180131');
DECLARE @startDate datetime = '20180101'
DECLARE @cutoffDate datetime = '20180131'
INSERT #dimdate(datevalue)
SELECT d
FROM
(
SELECT d = DATEADD(DAY, rn - 1, @StartDate)
FROM
(
SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate))
rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM sys.all_objects AS s1
CROSS JOIN sys.all_objects AS s2
-- on my system this would support > 5 million days
ORDER BY s1.[object_id]
) AS x
) AS y;
SELECT [datevalue],e.empid, e.empname, e.empStartDate
FROM #dimDate as d
CROSS JOIN #employee as e
WHERE d.datevalue IN ( select d.datevalue FROM #dimdate WHERE d.datevalue >= e.empStartDate and d.datevalue <= e.empEndDate) ;