22

I have an old table with a few rows that has a datetime column. I want to switch this to datetimeoffset but I want to be able to transfer the data that already exists. So I'm doing something like:

SET IDENTITY_INSERT Table_Temp ON

INSERT INTO Table_Temp
    (Col0, ... ColN,)
SELECT 
    COl0,.... ColN, from 
Table_Original;
    
SET IDENTITY_INSERT Table_Temp OFF

This works but the offset set is 0 when I do the datetime to datetimeoffset assignment. Fortunately the offset that I want to set it to is the offset of the current system. I can't seem to figure out an easy way to do this.

I want to be able to set the offset within the conversion. I was going to resort to doing a C# utility(or PowerShell) but I would rather keep it simple.

4

6 に答える 6

22

ドキュメントについては以下を参照してください。おそらく次のようなものが必要です。

-- 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 関数は、UTC 値を維持しながら、入力 DATETIMEOFFSET 値を指定されたタイム ゾーンに調整します。構文は 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 関数は、任意の日付と時刻のデータ型を入力として使用できます。たとえば、次のコードは、現在のシステムの日付と時刻の値を取得し、タイム ゾーンが -00:05 の datetimeoffset 値として返します。

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

于 2010-01-05T19:41:18.123 に答える
4

datetimeoffset 型を認識しているバージョンの SQL Server を使用している場合、この構文はサーバーのローカル tz オフセットを取得するために機能します。

select datepart(tz,sysdatetimeoffset())

結果はMINUTESです。

于 2010-10-11T15:13:06.983 に答える
3

ターゲット タイムゾーンで DST 保存が有効になっている場合、同じ年の中でタイムゾーン オフセットが変更されるため、これらの変換関数は正しく機能しません。

于 2010-12-15T06:59:09.223 に答える
2

以下を使用して、現在の SQL サーバーのオフセットを把握できます。

select datediff(MI,getdate(), getutcdate())

30 分や 15 分のタイム ゾーンが多数あるため、時間単位ではなく分単位でオフセットを取得する必要があります。

分の値を使用すると、次のようなものを使用して、入ってくる値を変更できます (歴史的にすべて現地時間として記録されていると仮定します)。

select dateadd(mi,datediff(MI,getdate(), getutcdate()), yourDateField)

効率のために、差は変わらないので、変数に一度計算してそれを使用します。

于 2010-01-05T19:36:22.067 に答える
0

この問題を正しく解決しようとする人にとって、ここで DST を考慮に入れることは、それを行うためのツールです。

https://github.com/mj1856/SqlServerTimeZoneSupport

于 2016-06-17T21:51:06.487 に答える