![](/img/trans.png)
[英]Database update time with increment based on number of records SQL Server
[英]How to update all datetime records to UTC time in a SQL Server database?
我有一個包含~1000個表的SQL Server數據庫。 大多數表都具有不同名稱的datetime
列。 目前存儲的值有偏移量,因為代碼將其與服務器中的當前日期一起插入。
目標是以UTC時間記錄所有日期時間記錄。
現在我想做兩件事:
使用這三個函數中的一些( SYSDATETIME, SYSDATETIMEOFFSET, SYSUTCDATETIME
)我可以得到偏移量。 下一步是查找所有日期時間記錄並更新它們。 你能幫幫我嗎?
某些datetime列的默認值為GETTIME
。 我想用SYSUTCDATETIME
更新它。 知道怎么樣?
PS:我不想將列的類型更改為datetimeoffset
因為MSSQL Server 2005中不支持該類型。
編輯 :因為有很多關於datetime
評論,問題的主題在不同的方向轉移,我建議你不要考慮datetime
列類型,但對於int
。 問題仍然存在。 更新許多表並更改列的默認值。
最好的問候mynkow
動態SQL以更新服務器上的所有用戶數據庫。 第一個查詢輸出到“結果”選項卡。 第二個查詢輸出到“消息”選項卡。
SET NOCOUNT ON;
GO
---------------------------------------------
-- #1 Dynamic SQL to update DATETIME values with UTC offset
DECLARE @t TABLE(TABLE_CATALOG VARCHAR(128), TABLE_SCHEMA VARCHAR(128), TABLE_NAME VARCHAR(128), COLUMN_NAME VARCHAR(128));
INSERT @t
EXEC sp_msforeachdb 'select db = "?"
, s.name
, t.name
, c.name
FROM [?].sys.tables t
JOIN [?].sys.columns c ON c.object_id = t.object_id
JOIN [?].sys.types y ON y.user_type_id = c.user_type_id
JOIN [?].sys.schemas s ON s.schema_id = t.schema_id
WHERE t.[type] = ''U''
AND y.name = ''DATETIME''
AND "?" NOT IN (''master'', ''tempdb'', ''model'', ''msdb'')';
DECLARE @Offset INT;
SET @Offset = - DATEPART(TZOFFSET, SYSDATETIMEOFFSET());
SELECT [SQL] = 'UPDATE ['+ C.TABLE_CATALOG +'].[' + C.TABLE_SCHEMA + '].[' + C.TABLE_NAME + '] SET [' + C.COLUMN_NAME + '] = DATEADD(MINUTE,' + CAST(@Offset AS VARCHAR(5)) + ',[' + C.COLUMN_NAME + ']);'
FROM @t C;
GO
---------------------------------------------
-- #2 Dynamic SQL to change DATETIME column defaults to SYSUTCDATETIME
DECLARE @t TABLE([SQL] VARCHAR(MAX));
DECLARE @SQL VARCHAR(MAX);
INSERT @t
EXEC sp_msforeachdb 'SELECT [SQL] = ''---------------------------------------------'' + CHAR(13) + CHAR(10)
+ ''-- [?].[''+s.name+''].[''+t.name+''].['' + c.name + '']'' + CHAR(13) + CHAR(10)
+ ''ALTER TABLE [?].[''+s.name+''].[''+t.name+'']'' + CHAR(13) + CHAR(10)
+ ''DROP CONSTRAINT [''+d.name + '']'' + CHAR(13) + CHAR(10)
+ ''GO'' + CHAR(13) + CHAR(10)
+ ''ALTER TABLE [?].[''+s.name+''].[''+t.name+''] ADD CONSTRAINT'' + CHAR(13) + CHAR(10)
+ ''[''+d.name+''] DEFAULT (SYSUTCDATETIME()) FOR [''+c.name + '']'' + CHAR(13) + CHAR(10)
+ ''GO'' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10)
FROM [?].sys.default_constraints d
JOIN [?].sys.columns c ON c.default_object_id = d.object_id
JOIN [?].sys.types y ON y.user_type_id = c.user_type_id
JOIN [?].sys.tables t ON t.object_id = d.parent_object_id AND t.[type] = ''U''
JOIN [?].sys.schemas s ON s.schema_id = t.schema_id
WHERE y.name = ''datetime''
AND "?" NOT IN (''master'', ''tempdb'', ''model'', ''msdb'')';
DECLARE C CURSOR FOR
SELECT * FROM @t
OPEN C
FETCH NEXT FROM C INTO @SQL;
WHILE @@FETCH_STATUS = 0 BEGIN
PRINT @SQL;
FETCH NEXT FROM C INTO @SQL;
END
CLOSE C;
DEALLOCATE C;
GO
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.