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

Posted

技术标签:

【中文标题】如何查找两个日期之间的连续天数【英文标题】:How to find continuous days between two dates 【发布时间】:2020-04-04 16:45:45 【问题描述】:

我有如图所示的场景,其中商品的可用日期没有继续。我想知道,每次可用时,它会在网站上持续停留多长时间。

我想为我的表中的每个项目找出如下:

【问题讨论】:

【参考方案1】:

这是一个典型的缝隙和孤岛问题。

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

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

最内部的查询恢复“上一个”记录的日期。下一个级别会在每次日期不连续时增加1 的窗口总和:这定义了组。然后,外部查询按组聚合。

Demo on DB Fiddle

样本数据:

项目 |可用日期 :--- | :------------- 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

查询结果:

项目 | 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

【讨论】:

间隙和孤岛是一个很常见的问题,但表达起来却很笨拙,以至于你想知道他们何时会在 SQL 中引入一个特定的运算符来对连续值组进行编号。

以上是关于如何查找两个日期之间的连续天数的主要内容,如果未能解决你的问题,请参考以下文章

查找以 m/d/Y 格式存储的两个日期之间的天数 [重复]

如何获取 Oracle 11g 中两个日期之间的天数? [复制]

如何计算 Postgres 中两个日期之间除星期日以外的天数?

如何计算两个日期之间的差异?

c#如何计算两个日期之间相隔天数

两个日期之间直到满足条件的天数之差