Я хотел бы создать хранимую процедуру, которая будет создавать строки в таблице для каждого дня в заданном диапазоне дат. Хранимая процедура принимает два входа: дату начала и дату окончания желаемого пользователем диапазона дат.
Итак, допустим, у меня есть таблица примерно так:
SELECT Day, Currency
FROM ConversionTable
Day - это DateTime, а Currency - целое число.
Для простоты, скажем так, я всегда хочу, чтобы столбец Currency был равен 1 для каждой из этих вставленных строк. Итак, если кто-то введет «5 марта 2017 года» в качестве даты начала и «11 апреля 2017 года» в качестве даты окончания, я хотел бы создать следующие строки:
2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1
Каков наилучший способ кодирования хранимой процедуры для этого? Я использую SQL Server 2008 R2 в своей тестовой среде, но наша реальная среда использует SQL Server 2012, поэтому я могу обновить свой тестовый компьютер, если в 2012 году были введены новые функциональные возможности, облегчающие эту задачу.
MAXRECURSION
подсказка в запрос для разрешения.DATEADD(DAY, 1, theDate) < @EndDate
, вы не получите конец диапазона, когда оба значения даты и времени имеют одинаковый компонент времени. Я изменил ответ соответствующим образом, но с помощью<= @EndDate
. Если вы не хотите, чтобы значение конца диапазона включалось независимо, тогда< @EndDate
действительно будет правильно.Другой вариант - использовать функцию с табличным значением. Этот подход очень быстрый и предлагает немного больше гибкости. Вы вводите диапазон даты / времени, дату и время. Также предлагает преимущество включения его в CROSS APPLY
Например
Возвращает
UDF, если интересно
источник
Используя в качестве примера пост Аарона Бертрана о том, как создать таблицу измерений даты , я придумал следующее:
Вы должны быть в состоянии поместить этот тип логики в хранимую процедуру и добавить все, что вам нужно.
источник
Недавно мне пришлось решать аналогичную проблему в Redshift, где у меня был только доступ на чтение, и поэтому мне требовалось решение, основанное исключительно на SQL (без хранимых процедур), чтобы получить строку за каждый час в диапазоне дат в качестве отправной точки для моего набора результатов. Я уверен, что другие могут сделать это более элегантным и изменить его для своих целей, но для тех, кто в этом нуждается, вот мое взломанное решение:
источник