获取 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)
另外,注意那些前导零。 ;)
为 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)
另外,注意那些前导零。 ;)