Oracle SQL对不存在于日期范围内的日期进行计数

w6mmgewl  于 2023-01-25  发布在  Oracle
关注(0)|答案(2)|浏览(121)

我有日期范围:

| date |
| -------- | 
| 1/1/2022 |
| 2/1/2022 |
| 3/1/2022 |
| 5/1/2022 |
| 6/1/2022 |
| 7/1/2022 |
| 8/1/2022 |
| 10/1/2022 |

我想得到这些日期之间不包含的日期,在本例中为4/1 and 9/1,我想得到这些日期的计数,在本例中为2,所以我想得到特定日期范围内不存在的日期的计数,我该如何实现呢?

nue99wik

nue99wik1#

select (max(date) - min(date) + 1) - count(distinct date)
from table_name

https://dbfiddle.uk/cSKZloYA
(max(date) - min(date) + 1)将给予范围内的总天数。
count(distinct date)将是表中现有(不同)天数。
两者之间的差异是不存在的天数。

注意:date是保留字,因此如果它是实际列名,则必须使用"date"分隔。(https://en.wikipedia.org/wiki/List_of_SQL_reserved_words

hwamh0ep

hwamh0ep2#

您可以使用LAG分析函数来查找前一个日期,然后计算出相差的天数,如果相差大于1,则缺少的天数为1天:

SELECT SUM(missing_dates) AS num_missing
FROM   (
  SELECT GREATEST("DATE" - LAG("DATE") OVER (ORDER BY "DATE") - 1, 0)
           AS missing_dates
  FROM   table_name
);

其中,对于示例数据:

CREATE TABLE table_name ("DATE") AS
SELECT DATE '2020-01-01' FROM DUAL UNION ALL
SELECT DATE '2020-01-02' FROM DUAL UNION ALL
SELECT DATE '2020-01-03' FROM DUAL UNION ALL
SELECT DATE '2020-01-05' FROM DUAL UNION ALL
SELECT DATE '2020-01-06' FROM DUAL UNION ALL
SELECT DATE '2020-01-07' FROM DUAL UNION ALL
SELECT DATE '2020-01-08' FROM DUAL UNION ALL
SELECT DATE '2020-01-10' FROM DUAL;

输出:
| 数量_缺失|
| - ------|
| 第二章|
fiddle

相关问题