2016-04-12 4 views
0

現地時間の日付をDATETIMEOFFSETのSQL Server(2008+)のフィールドの最善の方法とするにはどうすればよいですか?これを行うには、DATENAME(DW, DATEADD(mi, DATEPART(tz, @dt), @dt))は容認できるアプローチですか?それはうまくいくようですが、良い方法がありますか?SQL ServerのDateTimeOffset値のローカルDayOfWeek名を取得する

Tuesday, Monday, Tuesday 

-- this is a Tuesday in London but still a Monday in PST 
declare @dt datetimeoffset = '2016-4-12 01:14:00.00000 -08:00' 

select TOP(1) 
    DATENAME(DW, @dt), 
    DATENAME(DW, DATEADD(mi, DATEPART(tz, @dt), @dt)), 
    DATENAME(DW, CAST(@dt AS DATETIME)) 

結果は正解はMondayです。

+0

datetimeoffsetの値 '' 2016-4-12 01:14:00.00000 -08:00'は、PSTの '' 2016-4-12 01:14 'を意味し、 '' 2016-04- 12 08:14''のロンドンで、どちらも火曜日になるはずです – Eric

+0

@エリックありがとうございました。その時点では、DateTimeOffsetのMSDNのドキュメントは特に曖昧でした。 –

答えて

1
-- Corrected the value as -01:00 
DECLARE @dt datetimeoffset = '2016-4-12 01:14:00.00000 -01:00' 
SELECT 
    @dt AS OffSetForLondon, 
    DATENAME(DW, @dt) AS WeekNameLondon, -- London (-1:00) 
    DATENAME(DW, SWITCHOFFSET(@dt, '-08:00')) AS WeekNamePST -- PST (-8:00) 
1

実際、この値は太平洋とロンドンのタイムゾーンの両方で火曜日ですが、どちらもここには表示されません。私に説明させてください。

datetimeoffsetの値を読み取ると、と表示された日付と時刻は、指定されたオフセットに反映された現地時間であるになります。だから、あなたが提供する価値がある:

2016-04-12 01:14:00 -08:00 

これは火曜日、4月12日、2016年はそれが原因で効果で当分を節約夏時間の、で1:14アラスカ時間です。この日の00ので、同等の価値があるだろう:太平洋時間は-07で、実際にある

2016-04-12 02:14:00 -07:00 

ここでも、まだ4月(火曜日)12日。 UTCで

、それは次のようになります。

2016-04-12 09:14:00 +00:00 

しかし、これはロンドンでの時間ではなく、アイスランドの時間。ロンドンはこの日の+01:00です。夏時間のが原因です。ロンドンの同等の時間は、次のようになります。

2016-04-12 10:14:00 +01:00 

もう一度、まだ火曜日です。

あなたは、単に直接datetimeoffset値から日付部分を取ることができ、あなたが尋ねた実際の質問に答えるために:、また

declare @dt datetimeoffset = '2016-04-12 01:14:00.00000 -08:00' 
select DATENAME(DW, @dt) 

これらの先行ゼロを見て。 ;)

+0

ありがとうございます。 MSDNは、最初の部分がUTCかローカルかを少し曖昧に思っていました(そして、はい、私は以前の日付を選ぶべきでした、私はDSTの議論を避けようとしていました)。 –

+0

SQLは単純にISO8601/RFC3339標準に準拠しており、全面的に使用されています。すべての場合、表示される日付と時刻の値はローカル値です。 UTCに変換するには、*オフセットを減算します。オフセットが負の場合は、最初に符号を反転してから追加する方が簡単です。 –

関連する問題