とてもシンプルなようです...
CREATE PROCEDURE dbo.MoveDatesBack @NumberOfDays INT
AS BEGIN
UPDATE dbo.YourTableNameHere
SET SomeDateColum = DATEADD(DAY, @NumberOfDays, SomeDateColumn)
-- repeat the above statement for each table/column that you need to "move back"
END
これをそのように呼んでください:
EXEC dbo.MoveDatesBack @NumberOfDays = -30
またはあなたが必要とするものは何でも..。
このDATEADD
関数は、SQL Server 2008以降の任意の日付型で機能する必要があります。これをに適用すると、新しい関数が返されDATETIME2
ます。DATETIME2
しかし、これはStackoverflowには単純すぎるようです-ここで何が欠けていますか?
更新:これをグローバルに、データベース全体のすべてのテーブルとすべての日付関連の列で実行する場合は、次のようなカーソルベースのアプローチを使用できます。
CREATE PROCEDURE dbo.MoveDatesBack @NumberOfDays INT
AS BEGIN
DECLARE TableCursor CURSOR FAST_FORWARD
FOR
SELECT t.Name, c.name
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
INNER JOIN sys.types typ ON c.system_type_id = typ.system_type_id
WHERE typ.system_type_id IN (40, 42, 43, 61)
-- 40 = date, 42 = datetime2, 43 = datetimeoffset, 61 = datetime
DECLARE @TableName sysname, @ColumnName sysname
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Stmt NVARCHAR(999)
SET @Stmt = 'UPDATE ' + QUOTENAME(@TableName) +
' SET ' + QUOTENAME(@ColumnName) + ' = DATEADD(DAY, ' +
CAST(@NumberOfDays AS VARCHAR(10)) + ', ' +
QUOTENAME(@ColumnName) + ')'
-- PRINT @Stmt
EXEC (@Stmt)
FETCH NEXT FROM TableCursor INTO @TableName, @ColumnName
END
CLOSE TableCursor
DEALLOCATE TableCursor
END
自己責任!これにより、データベース全体で大規模な更新が行われます。何か問題が発生した場合に備えて、ロールバックするための十分なバックアップを用意してください。
すべてのテーブルがデフォルトのスキーマにあると想定しているという点で、かなり単純化されています。このサンプルでは、スキーマ情報を確認して含めていません。追加することができます-物事をもう少し複雑にする/より複雑にするだけです。