我需要使用T-SQL 2008 R2复制2012年至2013年的所有班次。每天有3班。开始日期和班次日期始终相同。结束日期(班次c)是第二天。
如你所见,如果我只使用dateadd(年,1,Col),我会在2013-02-28获得2套记录。第4,6和8行不应该存在(并且会导致PK违规)。第8行是错误的,因为班次C的结束时间应该是前一个日历日。
我总共有67,000行要复制
我唯一能想到的就是插入临时表,然后以某种方式识别欺骗/错误记录,删除然后插回到移位表中。我敢肯定必须有更好的方式
任何人都有狡猾的计划吗?
我想创建一个通用的存储过程,可以将闰年复制到非闰年,反之亦然
此致
标记
答案 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