【问题标题】:Incrementing a counter for dateadd增加 dateadd 的计数器
【发布时间】:2010-09-08 07:27:40
【问题描述】:

我正在尝试将日期之间的时间增加一定数量。例如,我想在日期 1,2 和 3 之间的时间上增加两个月。我无法增加“日期计数器”...

DECLARE @monthDiff int

SET @monthDiff = 1;

UPDATE [Table1]
SET [Date] = DATEADD(MONTH, (SET @monthDiff = @monthDiff + 1), [Date])
WHERE [ID] IN 
(
    SELECT [ID]
    FROM [Table2]
    WHERE [Description] = 'HE'
);

一个例子可能会有所帮助......

原定日期:

01/04/1984
01/05/1984
01/06/1984

新日期:

01/04/1984
01/06/1984
01/08/1984

有什么想法吗?

我使用的是 SQLServer 2005。

谢谢。

【问题讨论】:

  • 我不确定您要在这里做什么,通常是 WHILE @monthDiff
  • 一个例子可能会有所帮助... 原始日期:01/04/1984、01/05/1984、01/06/1984 新日期:01/04/1984、01/06/1984、 01/08/1984

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:
;WITH cte AS
(
SELECT t1.ID, 
       t1.[Date], 
       ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY [Date]) AS RN
FROM Table1 t1
JOIN Table2 t2
ON t1.ID = t2.ID 
WHERE t2.[Description] = 'HE'
)
UPDATE CTE
SET [Date] = DATEADD(MONTH, RN-1, [Date])

【讨论】:

  • 这几乎是我所需要的,只是我需要为每个 ID 设置“RowNumber”来“重置”。例如... [日期] 01/04/1984 [ID] 1 [RN] 1, [日期] 01/05/1984 [ID] 1 [RN] 2, [日期] 01/06/1984 [ID] 1 [RN] 3. 后跟 [日期] 01/10/1984 [ID] 2 [RN] 1,[日期] 01/11/1984 [ID] 2 [RN] 2,[日期] 01/12/1984 [ID] 2 [RN] 3
  • @paulio - 见编辑。您可以使用PARTITION BY [ID] 重置行号
  • 超级正是我想要的。感谢您的帮助。
【解决方案2】:

这应该有效,但前提是表中的每个原始日期都是唯一的。我将列命名为 mydate,因为我不认为 date 是列的合法(或合理)名称。如果您有某种 ID 列,这可能会更容易、更安全。那么我们将使用它作为光标而不是日期

declare @numberOfMonthsToAdd int
declare @currentDate dateTime
set @numberOfMonthsToAdd = 0
declare myCursor cursor  for 
select [mydate] from Table1
open myCursor
while @@fetch_Status<>-1
begin
fetch next from myCursor into @currentDate
update Table1 set [mydate] = DATEADD(month,@numberOfMonthsToAdd, [mydate]) where [mydate] = @currentDate
set @numberOfMonthsToAdd = @numberOfMonthsToAdd + 1

end
close mycursor
deallocate mycursor

【讨论】:

    【解决方案3】:

    从您的示例来看,您似乎想要更改相对于基准日期的日期:

    declare @basedate datetime
    select @basedate = min([Date]) FROM Table1 WHERE ...
    
    UPDATE [Table1]
    SET [Date] = DATEADD(MONTH, DATEDIFF(MONTH, @basedate, [Date]) * 2, [Date])
    WHERE ...
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多