复制从闰年转移到非闰年

时间:2012-12-14 18:23:27

标签: tsql copy leap-year

我需要使用T-SQL 2008 R2复制2012年至2013年的所有班次。每天有3班。开始日期和班次日期始终相同。结束日期(班次c)是第二天。

enter image description here

如你所见,如果我只使用dateadd(年,1,Col),我会在2013-02-28获得2套记录。第4,6和8行不应该存在(并且会导致PK违规)。第8行是错误的,因为班次C的结束时间应该是前一个日历日。

我总共有67,000行要复制

我唯一能想到的就是插入临时表,然后以某种方式识别欺骗/错误记录,删除然后插回到移位表中。我敢肯定必须有更好的方式

任何人都有狡猾的计划吗?

我想创建一个通用的存储过程,可以将闰年复制到非闰年,反之亦然

此致

标记

2 个答案:

答案 0 :(得分:0)

也许可以尝试将DISTINCT列表与WHERE End > Start结合使用,如此简化示例所示:

CREATE TABLE Shifts(ShiftCode CHAR, ShiftStart DATETIME, ShiftEnd DATETIME);
GO

INSERT Shifts
VALUES('A','2/26/2012 07:00:00','2/26/2012 15:00:00')
, ('B','2/26/2012 15:00:00','2/26/2012 23:00:00')
, ('C','2/26/2012 23:00:00','2/27/2012 07:00:00')
, ('A','2/27/2012 07:00:00','2/27/2012 15:00:00')
, ('B','2/27/2012 15:00:00','2/27/2012 23:00:00')
, ('C','2/27/2012 23:00:00','2/28/2012 07:00:00')
, ('A','2/28/2012 07:00:00','2/28/2012 15:00:00')
, ('B','2/28/2012 15:00:00','2/28/2012 23:00:00')
, ('C','2/28/2012 23:00:00','2/29/2012 07:00:00')
, ('A','2/29/2012 07:00:00','2/29/2012 15:00:00')
, ('B','2/29/2012 15:00:00','2/29/2012 23:00:00')
, ('C','2/29/2012 23:00:00','3/1/2012 07:00:00')
, ('A','3/1/2012 07:00:00','3/1/2012 15:00:00')
, ('B','3/1/2012 15:00:00','3/1/2012 23:00:00')
, ('C','3/1/2012 23:00:00','3/2/2012 07:00:00');
GO

SELECT DISTINCT ShiftCode
, ShiftStart = DATEADD(YYYY,1,ShiftStart)
, ShiftEnd = DATEADD(YYYY,1,ShiftEnd)
FROM Shifts
WHERE DATEADD(YYYY,1,ShiftEnd) > DATEADD(YYYY,1,ShiftStart)
ORDER BY DATEADD(YYYY,1,ShiftStart), ShiftCode
GO

结果:

A         2013-02-26 07:00:00.000 2013-02-26 15:00:00.000
B         2013-02-26 15:00:00.000 2013-02-26 23:00:00.000
C         2013-02-26 23:00:00.000 2013-02-27 07:00:00.000
A         2013-02-27 07:00:00.000 2013-02-27 15:00:00.000
B         2013-02-27 15:00:00.000 2013-02-27 23:00:00.000
C         2013-02-27 23:00:00.000 2013-02-28 07:00:00.000
A         2013-02-28 07:00:00.000 2013-02-28 15:00:00.000
B         2013-02-28 15:00:00.000 2013-02-28 23:00:00.000
C         2013-02-28 23:00:00.000 2013-03-01 07:00:00.000
A         2013-03-01 07:00:00.000 2013-03-01 15:00:00.000
B         2013-03-01 15:00:00.000 2013-03-01 23:00:00.000
C         2013-03-01 23:00:00.000 2013-03-02 07:00:00.000

答案 1 :(得分:0)

我想出来然后发现一些资源缺少2012年的班次

结束使用计数表进行创建,并为每年的每个班次做新的插入

SELECT
                    rh.PlanPressID
                    ,DATEADD(hh,(24 / @NoOfShifts) * (t.N - 1),@StartDateTime) AS ShiftStart
                   ,DATEADD(hh,(24 / @NoOfShifts) * (t.N),@StartDateTime) AS ShiftEnd
                   ,CHAR((t.N - 1) % @NoOfShifts + 65) AS ShiftCode
                   ,DATEADD(dd,0,DATEDIFF(dd,0,DATEADD(hh,(24 / @NoOfShifts) * (t.N - 1),@StartDateTime))) AS ShiftDate
                   ,0 AS Personnel
                  FROM
                    dbo.Tally t
                  CROSS JOIN dbo.ResourceHeader AS rh