0

T-SQL 2008 R2を使用して、2012年から2013年までのすべてのシフトをコピーする必要があります。1日3シフトあります。開始日とシフト日は常に同じです。終了日(シフトcの場合)は翌日です。

ここに画像の説明を入力してください

ご覧のとおり、dateadd(year、1、Col)を使用した場合、2013-02-28のレコードが2セット取得されます。行4、6、および8はそこにあるべきではありません(そしてPK違反を引き起こします)。シフトCの終了時刻は前暦日である必要があるため、行8は間違っています。

コピーする行は全部で67,000行あります

私が頭の中で考えることができるのは、一時テーブルに挿入してから、どういうわけか重複/不正なレコードを識別し、削除してからシフトテーブルに挿入し直すことだけです。もっと良い方法があるに違いないと思います

誰かが狡猾な計画を立てましたか?

うるう年をうるう年以外に、またはその逆にコピーできる汎用ストアドプロシージャを作成したい

よろしく

マーク

4

2 に答える 2

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
于 2012-12-14T19:13:30.483 に答える
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   
于 2012-12-14T23:05:55.830 に答える