【问题标题】:Moving T-SQL datatime column for X days overlapping UNIQUE constraint为 X 天重叠 UNIQUE 约束移动 TSQL 日期时间列
【发布时间】:2017-03-15 16:02:44
【问题描述】:

问题是在具有唯一值约束的列上使用 DATEADD 函数,考虑到新值将与现有值重叠并且实际上会违反约束这一事实,因为我们不能有两行具有相同的日期。

例如我有一个带有 [SomeDate] 列的表,它的类型是 DateTime,并且约束是唯一的。我的日期从 2017 年 1 月 1 日到 2018 年 1 月 1 日,我想通过为每个记录添加 7 天来更新记录。

【问题讨论】:

  • 我投票结束这个问题,因为它属于 codereview.stackexchange.com。鉴于 OP 在几秒钟内发布了一个问题和答案,唯一真正的问题可能是如何做得更好。

标签: sql sql-server tsql unique-constraint


【解决方案1】:

如果更新所有行,则唯一约束应该没有问题。
这是一个简单的例子:

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

【讨论】:

    【解决方案2】:

    一种可能的方法是将日期提前,使其超出当前的最小-最大范围,然后考虑我们要添加多少天,然后将它们放回原处。这是现成可用的解决方案:

    --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]);
    

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 2012-01-08
      相关资源
      最近更新 更多