迁移SQL Server的日期时间列的DateTimeOffset
-
18-09-2019 - |
题
我有一个旧表与具有日期时间列几行。我想这个切换到DATETIMEOFFSET,但我希望能够传递一个已经存在的数据。所以我做这样的事情:
SET IDENTITY_INSERT Table_Temp ON
INSERT INTO Table_Temp
(Col0, ... ColN,)
SELECT
COl0,.... ColN, from
Table_Original;
SET IDENTITY_INSERT Table_Temp OFF
此工作,但该偏移组为0时i执行dattime到DATETIMEOFFSET分配。幸运的偏移,我想将它设置为是当前系统的补偿。我不是TSQL大师,但我似乎无法找出一个简单的方法来做到这一点。
我希望能够以设置在转换中的偏移量。我要诉诸做一个C#程序(或PowerShell的),但我宁愿保持它的简单。
解决方案
如果您使用的是SQL Server版本的DATETIMEOFFSET类型,它知道,这句法会为得到你的本地TZ服务器的偏移工作:
select datepart(tz,sysdatetimeoffset())
其结果是单位为分钟。
其他提示
请参阅下面的文档,你可能想是这样的:
-- up here set the @time_zone variable.
INSERT INTO Table_Temp
(Col0, ... ColN,)
SELECT
COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from
Table_Original;
从 MSDN
在SWITCHOFFSET功能调整的 输入DATETIMEOFFSET值到 指定的时区,同时保留 UTC的价值。语法 SWITCHOFFSET(datetimeoffset_value, 时区)。例如,下面的 代码调整当前系统 DATETIMEOFFSET值的时区GMT 05:00:
选择 SWITCHOFFSET(SYSDATETIMEOFFSET() '-05:00');
因此,如果当前系统 DATETIMEOFFSET值是2月12日, 2009年10:00:00.0000000 -08:00,这 代码返回值2月12日, 2009年13:00:00.0000000 -05:00
在TODATETIMEOFFSET函数设置 输入日期的时区偏移量和 时间值。其语法是 TODATETIMEOFFSET(date_and_time_value, TIME_ZONE)。
此功能是不同 SWITCHOFFSET在几个方面。第一, 它不局限于一个 DATETIMEOFFSET值作为输入;宁 它接受任何日期和时间数据 类型。其次,它不尝试 调整基础上的时区的时间 源值之间差 和指定的时区,但 而不是简单地返回输入日期 和与指定时间的时间值 区作为DATETIMEOFFSET值。
的主要目的 TODATETIMEOFFSET功能是 转换不在时区类型 知悉给予DATETIMEOFFSET 时区偏移。如果日期 和时间值是一个DATETIMEOFFSET, 该TODATETIMEOFFSET功能变化 根据该对DATETIMEOFFSET值 相同的原始本地日期和时间 值加上新定的时区 偏移量。
例如,当前系统 DATETIMEOFFSET值是2月12日, 2009年10:00:00.0000000 -08:00,和你 运行以下代码:
选择 TODATETIMEOFFSET(SYSDATETIMEOFFSET() '-05:00');
2009在值2月12日 10:00:00.0000000 -05:00返回。 请记住,SWITCHOFFSET 函数返回2009年2月12日 13:00:00.0000000 -05:00,因为它 调整基于时间的时间 输入之间的差异区 (-08:00)和在指定的时间区 (-05:00)
如前所述,可以使用 与任何TODATETIMEOFFSET功能 日期和时间数据类型作为输入。对于 例如,下面的代码取 当前系统日期和时间值和 返回它DATETIMEOFFSET值 与时区-00:05:
选择TODATETIMEOFFSET(SYSDATETIME(), '-05:00');
这些转换功能将无法正常工作,如果DST保存在目标时区活性,作为时区偏移同年内变化。
您可以弄清楚什么是使用以下当前的SQL Server的偏移。
select datediff(MI,getdate(), getutcdate())
您需要得到在几分钟内,而不是时间偏移,因为有许多半小时甚至一刻钟时区。
使用分钟值,你可以改变你的价值观会在(假定他们在历史上的所有记录为本地时间),通过使用类似
select dateadd(mi,datediff(MI,getdate(), getutcdate()), yourDateField)
有关效率我将一次计算它变成一个变量和使用的是,由于不同的是不会改变的。
对于任何试图正确地解决这个问题,占DST这里是做它的工具。
这是已经提供了答案的轻微变化,并且不考虑DST的变化。但是,它可能是不够好很多目的:
dateadd(minute, -datepart(tz, sysdatetimeoffset()), @legacyDatetime)