2016-04-04 3 views
4

SQL Server 2016とAzure SQLに新しいAT TIME ZONE syntaxを使用しようとしています。私はちょうど夏時間のために調整されたdatetimeとしてロンドンで現在の時間を取得しようとしています。以下のすべてのコマンドを実行していた時点で、ロンドンの時間は3.27amでした。AT TIME ZONEを使用して指定された時間帯に現在時刻を取得する

最初のステップは、次のように私は首尾よく行うことができますdatetimeoffsetを得ることです:これは私が期待した値を返します

DECLARE @dto datetimeoffset 
SET @dto = (SELECT GETUTCDATE() AT TIME ZONE 'GMT Standard Time') 
SELECT @dto 

2016-04-04 02:27:54.0200000 +01:00 

次へ]を、私は変換したいですそれは私のアプリケーションが期待しているものであるdatetimeです。 datetimeoffsetを取り、ちょうど返すための簡単な方法があります - 私は何かを明らかに欠けているように私は感じ

SELECT SWITCHOFFSET(@dto,'+00:00') 
-- Returns 2016-04-04 01:27:54.0200000 +00:00 

SELECT CONVERT(datetime, @dto) 
-- Returns 2016-04-04 02:27:54.020 

SELECT CONVERT(datetime2, @dto) 
-- Returns 2016-04-04 02:27:54.0200000 

:私は私に私が探している結果を与えるどれも3つの異なるアプローチを、試してみましたそのオフセットの日時部分?

SELECT GETUTCDATE() AT TIME ZONE 'GMT Standard Time' 

GETUTCDATE()datetimeを返し、ゾーン情報をオフセット時間がない:

+1

「動作しない」を定義します。 2つの変換ステートメントは私にとって正しいことをしているようです... 03:27に戻るようにしようとするなら、@dtoを設定するときに「GMT Standard time」の代わりにLondon TZを使用してみませんか? –

+0

恐らく、 "うまくいけない"とは言い難いかもしれませんが、私は言葉遣いを変えるために質問を調整しますが、私は03:27の値で日時を取り戻す方法を持っていたいと思います。 「ロンドン」タイムゾーンは表示されません - GMT標準時はロンドンがAFAIKにいるタイムゾーンです。 – John

+0

SQL 2016インスタンスがインストールされていないため、動作を確認できません。私はTZ情報でWindowsレジストリを見ましたが、GMTが実際にDSTを観察しているように見えます。私があなたのコードで気づいたことの1つは、私がどこでも同じであると期待している 'getUTCdate()'と呼ばれていることです。これをテストするには、次の3つのことを試してみてください: '' GETUTCDATE() '' AT TIME ZONE 'GMT夏時間' ''' GETUTCDATE()をTIME ZONEで'東京標準時 '' 3) '' GETDATE() GMT標準時 ' –

答えて

11

あなたのコードの最初の行は、障害が含まれています。したがってthe MSDN documentationに記載されているように:オフセット情報なしで提供され

inputdate場合、機能は、inputdate値を目標時間帯で提供されると仮定すると、タイムゾーンのオフセットを適用します。

UTC時刻を取得したにもかかわらず、値がロンドン時間(この日の夏時間のUTC + 1)であると誤ってアサートしました。

これを処理する最も簡単な方法は、UTC時間を最初にdatetimeoffsetとして取得することです。

SELECT SYSDATETIMEOFFSET() AT TIME ZONE 'GMT Standard Time' 

これはドキュメントに述べAT TIME ZONE変換機能、呼び出し:

inputdateのDateTimeOffset値として提供される場合、AT TIME ZONE句は、ターゲットに変換しますタイムゾーン変換ルールを使用してタイムゾーンを設定します。 AT TIME ZONEへの最初の呼び出しが値をアサート

SELECT mydatetimefield AT TIME ZONE 'UTC' AT TIME ZONE 'GMT Standard Time' 

は、データが実際にどこかdatetimeフィールドから来る場合、あなたはこのように、機能性の両方部品を使用する必要があるかもしれないことを考えてみましょうUTCであり、第2の呼び出しにdatetimeoffsetを与え、それをロンドン時間に変換します。

これらの出力はdatetimeoffsetです。これは、元の質問に示された通りにキャストしたり、datetimeまたはdatetime2に変換することができます。 switchoffsetを使用しないでください。

また、ロンドンのWindowsタイムゾーン識別子は、常に"GMT Standard Time"です。グリニッジ標準時とイギリス夏時間の両方を含み、それらの間に適切な遷移があります。 "GMT Daylight Time"に変更しないでください。その識別子は存在しません。これは、Windowsタイムゾーンのセクションのthe timezone tag wikiにも記載されています。

+0

ありがとう!私は 'SELECT CONVERT(datetime、SYSDATETIMEOFFSET()AT TIME ZONE 'GMT標準時')'を使用していたものを正確に達成することができました。素晴らしい説明もありがとう。 – John

関連する問題