获取 SQL 服务器中 DateTimeOffset 值的本地 DayOfWeek 名称

Getting the local DayOfWeek name for a DateTimeOffset value in SQL Server

为 SQL 服务器 (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

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

实际上,该值在太平洋时区和伦敦时区都是星期二,但此处均未显示。请允许我解释一下。

当您读取 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)

另外,注意那些前导零。 ;)