【问题标题】:Getting the local DayOfWeek name for a DateTimeOffset value in SQL Server获取 SQL Server 中 DateTimeOffset 值的本地 DayOfWeek 名称
【发布时间】:2016-04-12 01:21:28
【问题描述】:

在 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

【问题讨论】:

  • datetimeoffset '2016-4-12 01:14:00.00000 -08:00' 的值在太平洋标准时间表示'2016-4-12 01:14',在伦敦表示'2016-04-12 08:14',两者都应该是星期二
  • @Eric 谢谢,DateTimeOffset 的 MSDN 文档在这一点上特别含糊。

标签: sql-server datetimeoffset dateadd datepart


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。 MSDN 对于第一部分是 UTC 还是本地似乎有点含糊(是的,我应该选择更早的日期,我试图避免 DST 讨论)。
    • SQL 只是遵循 ISO8601 / RFC3339 标准,这些标准在各地都在使用。在所有情况下,显示的日期和时间值都是本地值。要转换为 UTC,请减去 偏移量。当偏移量为负时,可能更容易想到先反转符号,然后再相加。
    猜你喜欢
    • 2012-06-28
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多