2017-03-15 3 views
-1

問題は、新しい値が既存の値と重複し、実際には制約の違反があるという事実を考慮して、一意の値制約を持つ列に対してDATEADD関数を使用することです。同じ日付の2つの行を持つことはできないためです。X日間重複するUNIQUE制約のT-SQLデータ列の移動

私はDateTime型の列[SomeDate]を持つテーブルを持っており、一意であるという制約があります。私は2017-01-01から2018-01-01までの日付を持ち、それぞれに7日間を追加してレコードを更新したいと考えています。

+2


は、ここで簡単な例です。 OPがお互いに数秒以内に質問と回答を投稿したことを考えると、唯一の本当の疑問はこれをもっとうまくやる方法かもしれません。 – scsimon

+0

質問をするときには、自分の知識を共有するために「あなた自身の質問に答える」オプションがあります。私は、他の人に同じような問題がある場合、そのような問題に対処する方法を他の人に示すためにそれをしました。誰かが正しい質問 - 答えを共有しているなら、特に私が「偽の投票」を得るためにそれをやっていないなら、投票のポイントを見ない。 –

答えて

0

可能な方法の1つは、日付を現在の最小最大範囲から外してから、追加する日数を考慮して戻すことです。

--Number of days we want to add to existing dates 
DECLARE @daysToMoveAhead int = 7; 

DECLARE @minDate datetime = (SELECT MIN([SomeDate]) from dbo.MyTable) 
DECLARE @maxDate datetime = (SELECT MAX([SomeDate]) from dbo.MyTable) 

DECLARE @diff int = DATEDIFF(DAY,@minDate,@maxDate) 

--temporary move the dates out of existing min-max range 
update dbo.MyTable set [SomeDate] = DATEADD(DAY, @diff,[SomeDate]); 

--bring dates back and add as many days as we wanted 
update dbo.MyTable set [SomeDate] = DATEADD(DAY, @daysToMoveAhead - @diff,[SomeDate]); 
2

すべての行を更新する場合は、一意制約に問題はありません。私はそれがcodereview.stackexchange.comに属しているため、オフトピックとして、この質問を閉じるために投票しています

CREATE TABLE T 
(
    SomeDate date NOT NULL, 
    CONSTRAINT uc UNIQUE (SomeDate) 
) 

;WITH CTE AS 
(
    SELECT CAST(GETDATE() As Date) As TheDate 
    UNION ALL 
    SELECT CAST(DateADD(DAY, 1, TheDate) As Date) 
    FROM CTE 
    WHERE TheDate < DATEADD(DAY, 10, GETDATE()) 
) 

INSERT INTO T(SomeDate) 
SELECT TheDate 
FROM CTE 

UPDATE T 
SET SomeDate = DATEADD(DAY, 3, SomeDate) 

You can see it in action on rextester

関連する問題