如何基于SQL SERVER

时间:2018-06-19 09:49:50

标签: sql-server

如何基于monthStartDateMonthEndDate在同一个表中多次复制表记录,假设我的表只包含一行monthStartDate和{{ 1}}。月份开始日期为MonthEndDate01-Jan-2018MonthendDate,现在我想将此一条记录复制到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
你能帮帮我吗。

1 个答案:

答案 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) ;