如何将一天添加到数据库中的所有DateTime列?

时间:2013-05-21 13:03:53

标签: sql sql-server-2008

我有一台托管我的应用程序的服务器。该应用程序正在运行。昨天我意识到服务器日期落后一天。

如何通过在每条记录中添加一天来更改服务器日期以及更新数据库中的所有DateTime列?

2 个答案:

答案 0 :(得分:7)

运行此SQL语句:

select 'update '+so.name+' set '+sc.name+' = dateadd(day,1,'+sc.name+')'
from sysobjects so
inner join syscolumns sc 
on so.id = sc.id
where sc.xtype = 61
and so.type = 'u'

复制结果并将其粘贴到查询窗口中并执行。

update Status set CreatedDate = dateadd(day,1,CreatedDate)
update Status set DateUpdated = dateadd(day,1,DateUpdated)
update TxSession set SessionDate = dateadd(day,1,SessionDate)
update TxSession set CreatedDate = dateadd(day,1,CreatedDate)
update TxSession set LastModifiedDate = dateadd(day,1,LastModifiedDate)

答案 1 :(得分:2)

为了将来参考,在编写动态SQL以执行此类工作时要记住的首要事项是:

  • 始终包含您的架构。你不知道所有的对象都是dbo。
  • 更重要的是总是把[]放在名字的周围。我不得不在很多情况下我的动态SQL死了,因为表的名称以数字或符号开头。

我知道我使用了一个游标(糟糕的肯,坏),但在这种情况下似乎是合适的。当然,您可以运行查询并将输出复制并粘贴到新的查询窗口。甚至可能更容易这样。

DECLARE UpdateCur
FOR 
    SELECT 'UPDATE ['+tabs.TABLE_SCHEMA+'].['+tabs.TABLE_NAME+'] ' + 
        'SET ['+cols.COLUMN_NAME+'] = DATEADD(dd,1,['+cols.COLUMN_NAME+']);'
    FROM INFORMATION_SCHEMA.COLUMNS cols
    JOIN INFORMATION_SCHEMA.TABLES tabs
        ON cols.TABLE_NAME = tabs.TABLE_NAME
    WHERE tabs.TABLE_TYPE = 'BASE TABLE' -- Exclude views
    -- Include datatypes DATE, DATETIME, DATETIME2, DATETIMEOFFSET
      AND cols.DATA_TYPE LIKE 'DATE%' 


DECLARE @sql nvarchar(max)
OPEN UpdateCur

FETCH NEXT FROM UpdateCur INTO @sql
WHILE (@@fetch_status <> -1)
BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
        EXEC sp_executeSQL @sql
    END
    FETCH NEXT FROM UpdateCur INTO @sql
END

CLOSE UpdateCur
DEALLOCATE UpdateCur
GO