将SQL Server DateTime列迁移到DateTimeOffset
我有一个有几行的旧表,其中有一个datetime列。我想将其切换到datetimeoffset,但我希望能够传输已经存在的数据。所以我做了一些类似的事情:将SQL Server DateTime列迁移到DateTimeOffset,sql,sql-server,tsql,sql-server-2008,datetimeoffset,Sql,Sql Server,Tsql,Sql Server 2008,Datetimeoffset,我有一个有几行的旧表,其中有一个datetime列。我想将其切换到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 -
SET IDENTITY_INSERT Table_Temp ON
INSERT INTO Table_Temp
(Col0, ... ColN,)
SELECT
COl0,.... ColN, from
Table_Original;
SET IDENTITY_INSERT Table_Temp OFF
-- up here set the @time_zone variable.
INSERT INTO Table_Temp
(Col0, ... ColN,)
SELECT
COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from
Table_Original;
这是可行的,但当我执行datetime到datetimeoffset赋值时,偏移量集是0。幸运的是,我想将其设置为当前系统的偏移量。我似乎想不出一个简单的方法来做这件事
我希望能够在转换中设置偏移量。我本来打算使用C实用程序或PowerShell,但我更愿意保持简单。您可以使用以下公式计算当前SQL server的偏移量
select datediff(MI,getdate(), getutcdate())
您需要以分钟而不是小时获得偏移量,因为存在许多半小时甚至四分之一小时的时区
使用minutes值,您可以通过以下方式更改您的值:假设它们在历史上都记录为本地时间
select dateadd(mi,datediff(MI,getdate(), getutcdate()), yourDateField)
为了提高效率,我会将其计算成一个变量,并使用它,因为差异不会改变。请参见下面的文档,您可能需要如下内容:
SET IDENTITY_INSERT Table_Temp ON
INSERT INTO Table_Temp
(Col0, ... ColN,)
SELECT
COl0,.... ColN, from
Table_Original;
SET IDENTITY_INSERT Table_Temp OFF
-- up here set the @time_zone variable.
INSERT INTO Table_Temp
(Col0, ... ColN,)
SELECT
COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from
Table_Original;
从
SWITCHOFFSET功能可调整
将DATETIMEOFFSET值输入到
指定的时区,同时保留
UTC值。语法是
SWITCHOFFSETdatetimeoffset_值,
时区。例如,以下
代码调整当前系统
datetimeoffset值到时区GMT
+05时00分:
挑选
SWITCHOFFSETSYSDATETIMEOFFSET,
'-05:00';
那么如果当前的系统
datetimeoffset值为2月12日,
2009年10:00:00.0000000-08:00,这
代码返回值2月12日,
2009年13:00:00.0000000-05:00
TODATETIMEOFFSET函数设置
输入日期和时间的时区偏移量
时间价值。它的语法是
TODATETIMEOFFSETdate和时间值,
时区
此功能不同于
切换偏移有几种方式。第一
它不限于
datetimeoffset值作为输入;相当地
它接受任何日期和时间数据
类型第二,它不试图这样做
根据时区调整时间
源值之间的差异
以及指定的时区,但
而是简单地返回输入日期
和指定时间的时间值
区域作为datetimeoffset值
会议的主要目的是:
TODATETIMEOFFSET函数是
转换非时区的类型
意识到DATETIMEOFFSET由给定的
时区偏移。如果给定的日期
时间值是DATETIMEOFFSET,
TODATETIMEOFFSET函数将更改
基于的DATETIMEOFFSET值
相同的原始本地日期和时间
值加上新的给定时区
抵消
例如,当前的系统
datetimeoffset值为2月12日,
2009年10:00:00.0000000-08:00,你呢
运行以下代码:
挑选
TODATETIMEOFFSETSYSDATETIMEOFFSET,
'-05:00';
2009年2月12日的价值
返回10:00:00.0000000-05:00。
记住开关偏移量
函数于2009年2月12日返回
13:00:00.0000000-05:00,因为
根据时间调整时间
输入之间的区域差异
-08:00和指定的时区
-05:00
如前所述,您可以使用
TODATETIMEOFFSET函数与任何
日期和时间数据类型作为输入。对于
例如,以下代码采用
当前系统日期和时间值以及
将其作为datetimeoffset值返回
时区为-00:05:
选择TODATETIMEOFFSETSYSDATETIME,
'-05:00';
如果您使用的SQL Server版本知道datetimeoffset类型,则此语法可用于获取服务器的本地tz偏移量: 选择dateparttz、sysdatetimeoffset
结果以分钟为单位。如果目标时区中的DST保存处于活动状态,则这些转换功能将无法正常工作,因为时区偏移量在同一年内发生变化。对于试图正确解决此问题的任何人,这里是解决DST的工具
这是已经提供的答案的一个微小变化,不考虑DST的变化。但是,它可能在许多方面都足够好:
dateadd(minute, -datepart(tz, sysdatetimeoffset()), @legacyDatetime)
--谢谢大家,我应该很清楚,我只是想添加偏移量,而不改变时间本身。但你们把我带到了那里;谢谢你,这正是我需要的。他们现在使用了如此多的重叠术语,以至于搜索文档都变得很困难……如果你需要考虑夏令时,这在历史日期上不起作用。正当您将根据getdate查找当前UTC偏移量,然后将其添加到历史日期字段中。但是,如果要考虑DST,偏移量会发生变化。东部标准时间为UTC-5,但东部夏时制为UTC-4。如果要转换历史日期,必须注意夏令时转换。我明白了
一想到它就头疼。你会纠正,然后批量转移历史数据,然后说明每年都有一个不同的时间点发生转移。你会如何找到历史日期的偏移量?关于这个v。老职位。时区和日期时间的偏移量是不同的。时区考虑了DST,而偏移量只是偏移量。考虑到DST,您将如何正确操作?不是真正的答案-更适合于注释。