我有一个包含d_date列的表。在此列中,仅包含日期值。
我的问题是"我想在此栏中找到错过的日期(d_date)"。
例如: 此列包含来自" 1-Jan-2007"的日期。到" 2007年1月7日" 那么我想在" 1-Jan-2007"之间找到错过的日期。至" 2007年1月10日" 我的结果应该是" 2007年1月8日"," 2007年1月9日"," 2007年1月10日"。
那么,我怎样才能得到这个结果呢?
答案 0 :(得分:9)
您可以将使用函数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。
答案 1 :(得分: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's answer为generate_series
提供了一个更简单的解决方案。