如何查找两个日期之间连续的天数

How to find continuous days between two dates

我有像图片中那样的情况,其中商品可用性的日期不会继续。我想知道,每次可用时,它会在网站上持续停留多长时间。

我想像下面这样找到我 table 中的每一项:

这是典型的缺口孤岛问题

这是一种使用 window 函数的方法:

select 
    item, 
    min(available_date) min_available_date, 
    max(available_date) max_available_date, 
    count(*) no_days
from (
    select 
        t.*, 
        sum(case when available_date = lag_available_date + interval '1' day then 0 else 1 end) 
            over(
                partition by item 
                order by available_date
                rows between unbounded preceding and current row
            ) grp
    from (
        select 
            t.*, 
            lag(available_date) 
                over(partition by item order by available_date) lag_available_date
        from mytable t
    ) t
) t
group by item, grp
order by item, min_available_date

最内层查询恢复"previous"记录的日期。下一级做一个 window 总和,每次日期不连续时增加 1:这定义了组。然后,外层查询按组聚合。

Demo on DB Fiddle

示例数据:

item | available_date
:--- | :-------------
ABA  | 2019-01-04    
ABA  | 2019-01-05    
ABA  | 2019-01-06    
ABA  | 2019-01-07    
ABA  | 2019-01-12    
ABA  | 2019-01-15    
ABA  | 2019-01-16    
ABA  | 2019-01-17    
ABA  | 2019-01-19    
ABA  | 2019-01-21    
ABA  | 2019-01-22    

查询结果:

item | min_available_date | max_available_date | no_days
:--- | :----------------- | :----------------- | ------:
ABA  | 2019-01-04         | 2019-01-07         |       4
ABA  | 2019-01-12         | 2019-01-12         |       1
ABA  | 2019-01-15         | 2019-01-17         |       3
ABA  | 2019-01-19         | 2019-01-19         |       1
ABA  | 2019-01-21         | 2019-01-22         |       2