我有一个旧表与具有日期时间列几行。我想这个切换到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这里是做它的工具。

https://github.com/mj1856/SqlServerTimeZoneSupport

这是已经提供了答案的轻微变化,并且不考虑DST的变化。但是,它可能是不够好很多目的:

dateadd(minute, -datepart(tz, sysdatetimeoffset()), @legacyDatetime)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top