如何查找两个日期之间的连续天数
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 中引入一个特定的运算符来对连续值组进行编号。以上是关于如何查找两个日期之间的连续天数的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 Oracle 11g 中两个日期之间的天数? [复制]