我需要在 SQL Server 中创建一个函数,该函数返回夏令时开始日期时间和夏令时结束日期时间。
我在网上遇到了一些例子,但是它们都使用 3 月 1 日和 11 月 1 日,这在技术上并不正确。
夏令时从 3 月第 2 个星期日凌晨 2 点开始,到 11 月第一个星期日凌晨 2 点结束。
我从下面的代码开始,但我确定它是错误的。任何帮助表示赞赏!:)
DECLARE @DSTSTART DATETIME SELECT @DSTSTART = CASE WHEN DATEPART(MONTH, SYSDATETIME()) = 3 AND DATEPART(weekday, SYSDATETIME()) = 1 AND DATEDIFF(week,dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, SYSDATETIME()), 0)), 0), SYSDATETIME() - 1) = 2 AND DATEPART(HOUR, SYSDATETIME()) = 2 THEN SYSDATETIME() END RETURN (@DSTSTART) END GO
正如评论中指出的那样,目前(2022 年 3 月),这一计算似乎明年可能会改变:美国可能不会在秋季关闭 DST。
不要忘记,夏令时时间表因国家/地区而异,并且随着时间的推移也会发生变化:例如,当前(从 2013 年到 2022 年)美国系统于 2007 年生效。
假设您想要美国当前的系统,这是任何给定年份的答案的一种形式。
SET DATEFIRST 7 DECLARE @year INT = 2013 DECLARE @StartOfMarch DATETIME , @StartOfNovember DATETIME , @DstStart DATETIME , @DstEnd DATETIME SET @StartOfMarch = DATEADD(MONTH, 2, DATEADD(YEAR, @year - 1900, 0)) SET @StartOfNovember = DATEADD(MONTH, 10, DATEADD(YEAR, @year - 1900, 0)); SET @DstStart = DATEADD(HOUR, 2, DATEADD(day, ( ( 15 - DATEPART(dw, @StartOfMarch) ) % 7 ) + 7, @StartOfMarch)) SET @DstEnd = DATEADD(HOUR, 2, DATEADD(day, ( ( 8 - DATEPART(dw, @StartOfNovember) ) % 7 ), @StartOfNovember)) SELECT @DstStart AS DstStartInUS , @DstEnd AS DstEndInUS
或作为函数,但您必须知道 DateFirst 设置为 7,否则数学将关闭。
CREATE FUNCTION GetDstStart ( @Year AS INT ) RETURNS DATETIME AS BEGIN DECLARE @StartOfMarch DATETIME , @DstStart DATETIME SET @StartOfMarch = DATEADD(MONTH, 2, DATEADD(YEAR, @year - 1900, 0)) SET @DstStart = DATEADD(HOUR, 2, DATEADD(day, ( ( 15 - DATEPART(dw, @StartOfMarch) ) % 7 ) + 7, @StartOfMarch)) RETURN @DstStart END GO; CREATE FUNCTION GetDstEnd ( @Year AS INT ) RETURNS DATETIME AS BEGIN DECLARE @StartOfNovember DATETIME , @DstEnd DATETIME SET @StartOfNovember = DATEADD(MONTH, 10, DATEADD(YEAR, @year - 1900, 0)) SET @DstEnd = DATEADD(HOUR, 2, DATEADD(day, ( ( 8 - DATEPART(dw, @StartOfNovember) ) % 7 ), @StartOfNovember)) RETURN @DstEnd END