选择未包含在集合中的下一个日期

时间:2018-02-27 23:59:24

标签: sql postgresql

我有一个视图,列出第二天发生的某些事件

SELECT column1, column2...
FROM table1
WHERE date = CAST(CURRENT_DATE + INTERVAL '1 DAY' AS DATE)

尽管如此,我还有一个“禁止日期”表:我不能使用这个特定的日期集,因此,如果第二天在禁止列表中,它必须跳转到下一个日期。有点像这样:

SELECT column1, column2...
FROM table1
WHERE 
    CASE 
        WHEN CAST(CURRENT_DATE + INTERVAL '1 DAY' AS DATE) IN (SELECT DISTINCT date FROM forbidden_date)
        THEN CAST(CURRENT_DATE + INTERVAL '2 DAY' AS DATE)
    ELSE 
        CAST(CURRENT_DATE + INTERVAL '1 DAY' AS DATE)
    END = date

问题在于“如果第二天第二天也在禁止名单中怎么办?依此类推?”

我实际上可以从脚本中控制所有这些,但我真的很好奇,如果我能通过一个查询来完成它

1 个答案:

答案 0 :(得分:2)

使用generate_series返回接下来365天内的所有日期,并选择不是禁止日期的第一个日期:

SELECT column1, column2...
FROM table1
WHERE date = (
    select min(d)
    from generate_series(current_date + 1, current_date + 365, '1 day') as dates(d)
    where d not in (select date from forbidden_dates))