背景:我们最近升级为处理UTC。即,通过每个sp和func并更改了t-sql代码来处理utc。例如,将getdate()更改为getutcdate()等。对于新的货件,我们很好,db是空白的。对于想要保留数据的老客户,我们需要运行一个脚本,将所有日期更新为utc。我将在t-sql中编写类似下面的代码,并想知道这是否是最好的方法。下面是伪代码。感谢
foreach (table in mydb.tables())
{
foreach (column col in table)
{
if (col.type == datetime)
{
update table set col = fn_convert_date_to_utc(col)
}
}
}
答案 0 :(得分:1)
假设您知道UTC与存储数据的时区之间的偏差,那很简单:
DECLARE @offset INT;
SET @offset = <offset>;
UPDATE table SET col = DATEADD(HOUR, @offset, col);
请注意,这可能是消极或积极的,我不知道格林威治的哪一方。
当然,如果您处于观察夏令时的时区,这会变得更加复杂;在这种情况下,您可能需要更广泛的解决方案,例如使用日历表。例如,如果您的数据在乔治布什改变美国DST规则之前延伸,这一点尤为复杂。我有an article from a long time ago that may be useful;最近的系列节目在这里:
此外,如果您的任何数据在春季前进/后退日的12:00 AM到2:00 AM之间落入该窗口,我无法确定更改它是否正确,因为它是转换日或不要改变它,因为它是在凌晨2点之前。