(T-SQL)夏时制是否在最后一小时发生?

时间:2018-11-08 21:16:11

标签: sql-server tsql sql-server-2017

我有一个将要使用表分区的过程(每个分区为1小时),并且在存档数据时需要处理夏令时翻转。

例如,在过去的一个周末,它从1:59:59变为1:00:00,因此分区代码第二次在凌晨1:05运行时,什么都不会发生-午夜时间已被关闭。

但是,当春天来临时,时间是从1:59 am到3:00 am,因此当作业在3:05运行时,它将切换到凌晨2点。。。原始表。

从理论上讲,我可以使用数据查找最旧的非当前分区,然后翻转该分区(分区键是默认的getdate()约束),但是我想知道是否有某种方法可以使用AT TIME ZONE来确定发生了“夏令时”,因此我们可以使用不同的代码来处理仍然存在的旧时间。

谢谢。

1 个答案:

答案 0 :(得分:1)

也许是这样的。基本上采用您当前的getdate()并在任何观察到的时区使用AT TIME ZONE。然后使用DATEPART tz并比较您的当前数据和以前的数据。

无论服务器时区是什么,使用AT TIME ZONE都会使您获得该时区中特定日期时间值的偏移量。

为进行比较,我认为您需要使用2个小时,其中1个小时用于切换,而1个小时则需要检查多久。

看一下:

DECLARE @BeforeDate DATETIME = '2018-11-04 1:59' --Before the change
DECLARE @AfterDate DATETIME = '2018-11-04 3:00' --After the change

--use can use AT TIME ZONE with DATEPART tz which tells you offset in minutes
--I'm in central, any should work for any that observe the time change
--Your offset is different because of the change.

SELECT DATEPART(tz, @BeforeDate AT TIME ZONE 'Central Standard Time')
SELECT DATEPART(tz, @AfterDate AT TIME ZONE 'Central Standard Time')

--using the above you could possibly compare current offset to 2 hours prior to see if they changed.  2 hours, 1 for the switch and 1 for how far back you want to compare.
DECLARE @CurrentDate DATETIME = '2018-11-04 3:00'  --"simulate" getdate() as of the time change

DECLARE @PriorOffSet INT = (SELECT DATEPART(tz, DATEADD(HOUR, -2, @CurrentDate) AT TIME ZONE 'Central Standard Time')) --You'd have to subtract 2 hours to account for the hour shift and the hour back you want to check.
DECLARE @CurrentOffset INT = (SELECT DATEPART(tz, @CurrentDate AT TIME ZONE 'Central Standard Time'))

SELECT @PriorOffSet, @CurrentOffset

IF @PriorOffSet <> @CurrentOffset
    SELECT 'Time changed in the last hour'
ELSE
    SELECT 'No time change in the last hour'