如何获取历史夏令时本地日期的时区偏移



有一个SQL Server在UTC+1中使用GETDATE(),因此它易于使用不同的本地时间。夏季为+02:00(CEST(,冬季为+01:00(CET(。

获取当前时间的时区偏移很容易如何获取历史日期的UTC偏移量

事实上,这个日期不言自明——如果它分别在3月和10月最后一个星期日的协调世界时1点之间,那么它就是夏令时,否则就不是夏令时。但这对于每个查询来说都是一种繁琐的启发式方法。

我似乎不能使用SYSDATETIMEOFFSET()/TODATETIMEOFFSET/SWITCHOFFSET/DATENAME(TZOFFSET,…),因为我需要已经知道偏移量。在这个例子中,AT TIME ZONE/sys.time_zone_info退出了,因为它是一个旧的2014 SQL服务器。

这一定是一个标准问题。除了使用UTC日期或存储每个日期的偏移量外,是否有一种合理的方法可以从特定(地理(时区的任何日期获得夏令时偏移量?

我对这个答案进行了调整,以找到相关的周日,并使用了CET/CEST的硬连线决定来获得这个解决方法:

DECLARE @Date DATETIME2(3) = '2008-09-15 13:38:42.951'
DECLARE @DST_Start DATETIME2(0) = (SELECT DATEADD(HOUR,1,DATEADD(DAY,DATEDIFF(DAY,'19000107',DATEADD(MONTH,DATEDIFF(MONTH,0,CONCAT(YEAR(@Date),'-03-01')),30))/7*7,'19000107')));
DECLARE @DST_End   DATETIME2(0) = (SELECT DATEADD(HOUR,1,DATEADD(DAY,DATEDIFF(DAY,'19000107',DATEADD(MONTH,DATEDIFF(MONTH,0,CONCAT(YEAR(@Date),'-10-01')),30))/7*7,'19000107')));
SELECT CONVERT(VARCHAR(29),TODATETIMEOFFSET(@Date,CASE WHEN @Date BETWEEN @DST_Start AND @DST_End THEN '+02:00' ELSE '+01:00' END),126);
-- ⇒ 2008-09-15T13:38:42.951+02:00

这种具体的有机方法并没有考虑到调整期内的模糊性,但无论如何,这是一个关键。

我用它创建了一个函数。

DECLARE @UTCDateTime DATETIME2(3) = '2023-03-08 12:00:00.0000000'
DECLARE @Localtime datetime2;
DECLARE @DST_Start DATETIME2(0) = CONVERT(datetime, CONCAT(YEAR(@UTCDateTime),'-03-12'));-- USA Begin of Daylight savings
DECLARE @DST_End   DATETIME2(0) = CONVERT(datetime, CONCAT(YEAR(@UTCDateTime),'-11-05'));-- USA End of Daylight savings
SELECT @Localtime = DATEADD(HOUR,CASE WHEN @UTCDateTime BETWEEN @DST_Start AND @DST_End THEN -4 ELSE -5 END,@UTCDateTime) 
SELECT @Localtime 

我接受了达卡布的想法。我在底特律,所以我不得不更新日期变更日期。

最新更新