создать временную таблицу sql последовательных дат для левого внешнего соединения с - PullRequest
6 голосов
/ 19 января 2011

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 19 января 2011

В SQL Server 2005 и более поздних версиях вы можете использовать что-то вроде этого (общее выражение таблицы 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 против вашей таблицы и вернуть результат.

5 голосов
/ 25 февраля 2014

Еще один способ сделать это с таблицей памяти.Он не захлебнется из-за ограничений рекурсии, как некоторые из приведенных выше решений.

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

4 голосов
/ 19 января 2011

Один путь будет с 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...