确定夏令时是否有效? SQL Server

时间:2011-07-21 18:49:03

标签: sql dst

我有一个用户表,UTC时间偏移,如果他们观察夏令时。是否有内置的方法来获得正确的用户时间?

4 个答案:

答案 0 :(得分:1)

现在我正在这样做:

SELECT 
CASE USEDAYLIGHTSAVING
    WHEN 1 THEN
        CASE DATEDIFF(HH,GETUTCDATE(),GETDATE())
                -- I know the server is set to Mountan time and follows daylight saving time
                -- MDT = -6
                -- MST = -7
            WHEN -6 THEN 
                DATEADD(HH,TIMEZONEOFFSET+1,GETUTCDATE())
            ELSE 
                DATEADD(HH,TIMEZONEOFFSET,GETUTCDATE())
        END
    ELSE
            DATEADD(HH,TIMEZONEOFFSET,GETUTCDATE())
    END
FROM 
USERS

它可以工作,但是如果服务器被移动到另一个时区或者没有休闲夏令时我就会被淹没。

答案 1 :(得分:0)

  

我有一个用户表,UTC时间偏移,如果他们观察夏令时。是否有内置的方法来获得正确的用户时间?

世界各地的不同时区都以不同的方式观察夏令时。他们在一天的不同时间开始和停止。简单地使用偏移量和DST标志不足以可靠地转换。

相反,您需要时区标识符,例如America/Los_Angeles或其中一个listed here。完成后,您可以使用我的SQL Server Time Zone Support项目进行转换。

答案 2 :(得分:0)

这并非在所有情况下都有效,但是对于在美国(含DST)定义为3月2日(星期日)和11月1日(星期日)之间的用户来说,这是一个快速解决方案。

DECLARE @Date datetime2 = '2018-11-04 02:01:00'

SELECT 
    CASE 
        WHEN @Date between
            DATETIMEFROMPARTS(YEAR(@Date), 3, (8 - DATEPART(WEEKDAY, DATEFROMPARTS(YEAR(@Date), 3, 1))) + 8, 02, 00, 00, 00)
            and
            DATETIMEFROMPARTS(YEAR(@Date), 11, (8 - DATEPART(WEEKDAY, DATEFROMPARTS(YEAR(@Date), 11, 1))) + 1, 02, 00, 00, 00)
        THEN 1
        ELSE 0
    END --Is it dst?

答案 3 :(得分:0)

SQL 2016中引入的Function Show-DiskInfo { $HWDisks = Get-PhysicalDisk $HardwareInfo = New-Object PSCustomObject -Property @{ Info = "Backupserver Hardware Info `n----------------" } $x = 1 foreach ($disk in $HWDisks) { $HardwareInfo | Add-Member NoteProperty -Name Disk$x -Value ($disk.FriendlyName + " " + [math]::Round(($disk.Size/1GB),2) + " GB") $x++ } $HardwareInfo | Format-List } Show-DiskInfo 表允许确定与UTC的偏移量以及DST当前是否有效。

sys.time_zone_info

查询结果将是: