Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Последовательности значений даты и времени в T-SQL

136
Исходник базы данных

В самых различных ситуациях работы с данными требуется генерировать последовательности дат и времени между заданными на входе точками начала @start и ©end и с заданным интервалом (например, 1 день, 12 часов и т.п.). За примерами таких ситуаций не нужно далеко ходить — наполнение размерности времени в хранилище данных, планирование запуска приложений и т.п.

Эффективным средством решения этой задачи является описанная в предыдущей статье функция GetNums. На вход поступают начальные и конечные дата и время — ©start и ©end, и с применением функции DATEDIFF вычисляется, сколько интервалов нужной величины помещается в заданный диапазон. Далее вызывается функция GetNums со следующими входными данными: ©low - «0», a ©high равно вычисленной на предыдущем этапе разнице. Наконец для получения результирующих даты и времени к @start добавляется умноженный на n временной интервал.

Вот пример генерации последовательности дат в диапазоне с 1 по 12 февраля 2012 года:

DECLARE 
  @start AS DATE = '20120201',
  @end   AS DATE = '20120212';

SELECT DATEADD(day, n, @start) AS dt
FROM dbo.GetNums(0, DATEDIFF(day, @start, @end)) AS Nums;
Генерация дат

Если интервал является кратным определенной единице времени, например 12 часов, используйте эту единицу (в данном случае час) при вычислении разницы между @start и @end, и разделите результат на 12, чтобы получить @high, а затем умножьте n на 12, чтобы получить число часов, которые нужно добавить к @start для вычисления результирующих значений даты и времени. В качестве примера, следующий код генерирует последовательность значений даты и времени между 12 и 18 февраля 2012 года с 12-часовым интервалом между значениями последовательности:

DECLARE 
  @start AS DATETIME2 = '2012-02-12 00:00:00.0000000',
  @end   AS DATETIME2 = '2012-02-18 12:00:00.0000000';

SELECT DATEADD(hour, n*12, @start) AS dt
FROM dbo.GetNums(0, DATEDIFF(hour, @start, @end)/12) AS Nums;
Генерация диапазонов дат
Пройди тесты