+1, потому что ваше сообщение было отправлено в точную минуту принятого ответа, и потому что ваше предложение WHERE более устойчиво, чем его (оно работает с интервалами, превышающими 1, что игнорируется в принятом ответе).

я есть таблица данных, которую я хочу выбрать через сохраненный процесс, так что пользователи могут подключить к нему внешний интерфейс MS Excel и использовать необработанные данные в качестве источника для графика.

Проблема с необработанными данными таблицы заключается в наличии пробелов в датах, потому что если нет данных за определенный день (нет записей с этой датой), то когда пользователи пытаются построить график, это создает проблемы.

Я также хочу обновить свой сохраненный процесс до левого внешнего соединения с временной таблицей дат, чтобы правая часть входила в нули, которые я могу привести к нулю, чтобы они имели простой опыт построения.

Как лучше всего создать таблицу дат в одном поле между начальной и конечной датой?

 Matt Gibson19 янв. 2011 г., 17:03
Вы ищете генератор последовательности;это была статья, которую я использовал для своей базы в последний раз, когда она мне понадобилась. Хотя, конечно, если вы просто захотите сделать это один раз, курсор или простой цикл подойдут ...

Ответы на вопрос(3)

Решение Вопроса

о вроде этого (общее выражение таблицы CTE), чтобы сделать это:

DECLARE @DateFrom DATETIME
SET @DateFrom = '2011-01-01'

DECLARE @DateTo DATETIME
SET @DateTo = '2011-01-10'

;WITH DateRanges AS
(
    SELECT @DateFrom AS 'DateValue'
    UNION ALL
    SELECT DATEADD(DAY, 1, DateValue)
    FROM DateRanges
    WHERE DateValue < @DateTo
)
SELECT * FROM DateRanges

Вы могли быLEFT OUTER JOIN этот CTE против вашей таблицы и вернуть результат.

 Guillermo Gutiérrez04 нояб. 2013 г., 15:59
Это более простой способ, но если он увеличивается до тысяч или миллионов дат, он имеет низкую производительность по сравнению с временной или постоянной таблицей. Проверь это:sqlservercentral.com/articles/T-SQL/74118
 Ashton Sheets19 июн. 2013 г., 23:35
В заключение! Спасибо тебе за это. Казалось, что это должно быть так просто, но все остальные ответы на очень похожие вопросы связаны с созданием функций или постоянных таблиц. Это именно то решение, которое мне было нужно и работает отлично.

я из-за ограничений рекурсии, как некоторые из приведенных выше решений.

DECLARE @dates AS TABLE ([Date] date);

DECLARE @date date = {d '2010-10-01'};
DECLARE @endDate date = {d '2010-11-01'};

while (@date < @endDate)
BEGIN
    INSERT INTO @dates VALUES (@date);
    SET @date = dateadd(DAY, 1, @date)
END
SELECT * FROM @dates;

SQL Fiddle

 Diego17 февр. 2015 г., 19:19
Используйте это решение, если вы получаете «Максимальная рекурсия исчерпана».

Один путь был бы с CTE:

with cte_dates as (
  select cast('20110119' as datetime) as [date]
  union all
  select dateadd(dd, 1, [date])
      from cte_dates
      where dateadd(dd, 1, [date]) <= '20111231'
)
select [date], YourColumn
    from cte_dates
        left join YourTable
            on ...
option (maxrecursion 0);
 kmote06 авг. 2015 г., 17:41
+1, потому что ваше сообщение было отправлено в точную минуту принятого ответа, и потому что ваше предложение WHERE более устойчиво, чем его (оно работает с интервалами, превышающими 1, что игнорируется в принятом ответе).

Ваш ответ на вопрос