将SQL Server DateTime列迁移到DateTimeOffset

hdz*_*hdz 22 sql t-sql sql-server datetimeoffset sql-server-2008

我有一个旧表,其中有几行具有日期时间列.我想将其切换到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
Run Code Online (Sandbox Code Playgroud)

这可以工作,但是当我执行dattime到datetimeoffset赋值时,偏移设置为0.幸运的是,我想要设置的偏移量是当前系统的偏移量.我不是tsql大师,但我似乎无法找到一个简单的方法来做到这一点.

我希望能够在转换中设置偏移量.我打算使用ac#utility(或PowerShell),但我宁愿保持简单.

Hog*_*gan 22

请参阅下面的doc,您可能需要以下内容:

-- up here set the @time_zone variable.

INSERT INTO Table_Temp
    (Col0, ... ColN,)
SELECT 
    COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from 
Table_Original;
Run Code Online (Sandbox Code Playgroud)

来自MSDN

SWITCHOFFSET函数将输入DATETIMEOFFSET值调整为指定的时区,同时保留UTC值.语法是SWITCHOFFSET(datetimeoffset_value,time_zone).例如,以下代码将当前系统datetimeoffset值调整为时区GMT +05:00:

SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(),' - 05:00');

因此,如果当前系统datetimeoffset值是2009年2月12日10:00:00.0000000 -08:00,则此代码返回值2009年2月12日13:00:00.0000000 -05:00.

TODATETIMEOFFSET函数设置输入日期和时间值的时区偏移量.其语法为TODATETIMEOFFSET(date_and_time_value,time_zone).

此功能在几个方面与SWITCHOFFSET不同.首先,它不限于datetimeoffset值作为输入; 而是它接受任何日期和时间数据类型.其次,它不会尝试根据源值和指定时区之间的时区差异来调整时间,而只是返回带有指定时区的输入日期和时间值作为datetimeoffset值.

TODATETIMEOFFSET函数的主要目的是通过给定的时区偏移将不是时区感知的类型转换为DATETIMEOFFSET.如果给定的日期和时间值是DATETIMEOFFSET,则TODATETIMEOFFSET函数会根据相同的原始本地日期和时间值加上新的给定时区偏移量更改DATETIMEOFFSET值.

例如,当前系统datetimeoffset值是2009年2月12日10:00:00.0000000 -08:00,并运行以下代码:

SELECT 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:

SELECT TODATETIMEOFFSET(SYSDATETIME(),' - 05:00');


Bro*_*oam 4

如果您使用的 SQL Server 版本支持 datetimeoffset 类型,则此语法可用于获取服务器的本地 tz 偏移量:

select datepart(tz,sysdatetimeoffset())

结果只需几分钟。