Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQL Server DateTime列迁移到DateTimeOffset_Sql_Sql Server_Tsql_Sql Server 2008_Datetimeoffset - Fatal编程技术网

将SQL Server 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 -

我有一个有几行的旧表,其中有一个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
-- 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,您将如何正确操作?不是真正的答案-更适合于注释。