(T-SQL) Произошло ли летнее время за последний час? - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть процесс, который будет использовать разбиение таблиц (каждый раздел занимает 1 час), и мне нужно обрабатывать переходы на летнее время при архивировании данных.

Например, в прошедшие выходные дни он проходил с 1:59:59 до 1:00:00, поэтому во второй раз, когда код разделения выполнялся в 1:05, ничего не происходило - полночный час уже был ВЫКЛЮЧЕН.

Однако, когда наступает весна, время меняется с 1:59 до 3:00, поэтому, когда задание выполняется в 3:05, оно ВЫКЛЮЧАЕТСЯ в 2 часа ночи ... оставляя данные за 1 час в оригинальный стол.

Теоретически я могу просто найти самый старый нетоковый раздел с данными и перевернуть его (ключ раздела - это ограничение getdate () по умолчанию), но мне было интересно, есть ли какой-нибудь способ использовать AT TIME ZONE для определения эта летняя экономия «произошла», так что у нас мог быть другой код, чтобы справиться с тем старым часом, все еще находящимся там.

Спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

Может быть, что-то вроде этого. В основном возьмите ваш текущий 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'
...