0

SQL Server (2008+) でフィールドの現地時間の曜日名を取得する最良の方法は何ですか? これを行うための許容可能なアプローチはありますかDATETIMEOFFSET? DATENAME(DW, DATEADD(mi, DATEPART(tz, @dt), @dt))うまくいくようですが、もっと良い方法はありますか?

-- 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))

結果は

Tuesday, Monday, Tuesday

正解はMondayです。

4

2 に答える 2

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)
于 2016-04-12T01:51:47.450 に答える
1

実際には、その値は太平洋時間帯とロンドン時間帯の両方で火曜日ですが、ここではどちらも表されていません。説明させてください。

値を読み取ると、datetimeoffset表示される日付と時刻、指定されたオフセットによって反映される現地時間です。したがって、指定した値は次のとおりです。

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

これは 2016 年 4 月 12 日火曜日です。サマータイムが実施されているため、アラスカ時間で01:14です。太平洋時間は実際にはこの日付の -07:00 であるため、同等の値は次のようになります。

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)

また、先頭のゼロにも注意してください。;)

于 2016-04-12T01:52:25.973 に答える