2015-02-18 3 views
6

У меня есть одна таблица, содержащая столбец d_date. В этом столбце указывается только значение даты.Найти отсутствующие даты (PostgreSQL)

Мой вопрос: «Я хочу найти недостающие даты из этой колонки (d_date)».

пример: Этот столбец содержит даты из "1-Jan-2007" на "7-Jan-2007" тогда я хочу найти дату между "1-Jan-2007" пропавших без вести «10-Jan-2007 « и мой результат должен быть« 8-янв-2007 »,« 9-янв-2007 »,« 10-янв-2007 ».

Итак, как я могу получить этот результат?

ответ

8

Вы можете сравнить серию дат, созданные с помощью функции generate_series(start, stop, step interval) к датам в таблице:

SELECT * FROM generate_series('2007-01-01', '2007-01-10', interval '1 day') AS dates 
    WHERE dates NOT IN (SELECT d_date FROM your_table); 

Дополнительная информация о функции generate_series из PostgreSQL документации: 9.24. Set Returning Functions.

0

Вы можете использовать WITH RECURSIVE построить таблицу дат и выберите даты, которые не в таблице:

WITH RECURSIVE t(d) AS (
    (SELECT '2015-01-01'::date) 
UNION ALL 
    (SELECT d + 1 FROM t WHERE d + 1 <= '2015-01-10') 
) SELECT d FROM t WHERE d NOT IN (SELECT d_date FROM tbl); 

Edit: уведомление о том, что рекурсивное ОТВ может быть излишним здесь. Epikuros's answer обеспечивает более простое решение с generate_series.

+2

Нет необходимости в рекурсивном CTE - 'generate_series()' будет более эффективным –

+0

@a_horse_with_no_name true. Редактирование. –

Смежные вопросы