查找缺失的日期(PostgreSQL)

11

我有一个表,其中包含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日”。

那么,我该如何得到这个结果?

2个回答

21

您可以使用函数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


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);

编辑:注意,递归CTE可能在这里有些过头了。Epikuros的答案提供了一个使用generate_series的更简单的解决方案。


2
不需要使用递归CTE - generate_series() 更高效。 - user330315
@a_horse_with_no_name 真的。正在编辑。 - Ainar-G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接