Последовательности значений даты и времени в T-SQL
136Работа с базами данных в .NET Framework --- Оконные функции T-SQL --- Последовательности значений даты и времени
Исходник базы данныхВ самых различных ситуациях работы с данными требуется генерировать последовательности дат и времени между заданными на входе точками начала @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;