我有一个表,其中包含d_date列。在这个列中,仅包含日期值。
我的问题是:“我想从这个列(d_date)中找到缺失的日期。”
例如: 这一列包含从“2007年1月1日”到“2007年1月7日”的日期, 然后我想在“2007年1月1日”到“2007年1月10日”之间找到缺失的日期 我的结果应该是“2007年1月8日”,“2007年1月9日”,“2007年1月10日”。
那么,我该如何得到这个结果?
我有一个表,其中包含d_date列。在这个列中,仅包含日期值。
我的问题是:“我想从这个列(d_date)中找到缺失的日期。”
例如: 这一列包含从“2007年1月1日”到“2007年1月7日”的日期, 然后我想在“2007年1月1日”到“2007年1月10日”之间找到缺失的日期 我的结果应该是“2007年1月8日”,“2007年1月9日”,“2007年1月10日”。
那么,我该如何得到这个结果?
您可以使用函数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);
PostgreSQL文档中有关于函数generate_series
更多信息,请参见:9.24. Set Returning Functions。
您可以使用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);
编辑:注意,递归CTE可能在这里有些过头了。Epikuros的答案提供了一个使用generate_series
的更简单的解决方案。
generate_series()
更高效。 - user330315