В SQL Server 2016 были реализованы временные таблицы с системным управлением версиями, позволяющие отслеживать историю изменений данных. В предлагаемой статье я бы хотел дать читателям несколько рекомендаций по работе с временными таблицами, например в отношении представления значения столбца периода в целевом часовом поясе, представления вырожденных интервалов и оптимизации, используемой вложенным предложением CONTAINED IN.

Тестовые данные

В некоторых примерах статьи запрос направляется во временную таблицу тестовой базы данных WideWorld­Importers. Документацию по этой базе данных можно найти по адресу: go.microsoft.com/fwlink/? LinkID=800631. Чтобы установить тестовую базу данных на своем компьютере, загрузите файл резервной копии WideWorldImporters-Full.bak по адресу: go.microsoft.com/fwlink/? LinkID=800630. Предположим, вы поместили файл в папку C:\WWI\; восстановите базу данных, выполнив программный код листинга 1 (при необходимости замените исходный и целевой пути).

Представление столбцов периода в целевом часовом поясе

Напомню, что столбцы периода во временной таблице содержат время часового пояса в формате UTC как значения DATETIME2. Предположим, что их нужно представить как значения DATETIMEOFFSET в определенном часовом поясе. Рекомендуемый инструмент для таких преобразований — функция AT TIME ZONE, которая рассматривалась в статье «Тип данных DATETIMEOFFSET и функция AT TIME ZONE в SQL Server 2016» (опубликована в Windows IT Pro/RE № 3 2017 года). Очевидно, что это задача непростая. Для возвращения значения типа DATETIME2, сохраненного в исходном часовом поясе (в нашем случае UTC) как значения типа DATETIMEOFFSET с определенным целевым часовым поясом, необходимы два преобразования AT TIME ZONE: одно для преобразования значения без учета сдвига в значение со сдвигом с исходным часовым поясом, другое для переключения сдвига с исходного часового пояса на целевой. Такое преобразование демонстрирует программный код в листинге 2. Этот программный код формирует выходные данные, показанные на экране 1.

 

Выходные данные листинга 2
Экран 1. Выходные данные листинга 2

 

Сложность временных таблиц связана с текущими строками, хранящими максимально возможное значение типа в столбце конца периода (9999-12-31 23:59:59.9999999 при использовании максимальной точности). В качестве примера рассмотрите запрос, приведенный в листинге 3.

Этот запрос формирует выходные данные, показанные на экране 2. Здесь показаны четыре элемента, каждый с четырьмя вариантами. Текущий вариант отмечен максимальным значением в столбце ValidTo.

 

Выходные данные запроса листинга 3
Экран 2. Выходные данные запроса листинга 3

 

Если нужно представить значения в целевом часовом поясе с отрицательным сдвигом, например тихоокеанское время США (зима), то местное время корректируется назад. При использовании максимального значения оно выражается в целевом часовом поясе: 9999-12-31 15:59:59.9999999 -08:00. Это показано в программным коде лис­тинга 4.

Этот программный код формирует выходные данные, показанные на экране...

Это не вся статья. Полная версия доступна только подписчикам журнала. Пожалуйста, авторизуйтесь либо оформите подписку.
Купить номер с этой статьей в PDF