如何检查oracle sql中两个日期之间有多少个星期日

问题描述 投票:0回答:1

我想检查 2 个日期之间存在“星期日”的数量
例如,

CREATED_DATE 21-10-23 06:00:00.000000000 下午 星期六

UPDATED_DATE 23-10-23 06:00:00.000000000 下午 星期一

我想看看中间有多少个“星期日”,在本例中1

这是我的代码,case语句要重点关注,

SUM(
    CASE
        WHEN EXTRACT(HOUR FROM (UPDATEDDATE - CREATEDDATE)) <= 4   -- hours should be < or = to 4
        AND (
            EXTRACT(DAY FROM (UPDATEDDATE - CREATEDDATE)) -        -- days in between
            (
                SELECT COUNT(*)
                FROM DUAL
                WHERE TO_CHAR(CREATEDDATE + LEVEL, 'D') = '1'      -- is sunday?
                CONNECT BY CREATEDDATE + LEVEL <= UPDATEDDATE      -- checking till the end date
            ) = 0
        )
        THEN 1
        ELSE 0
    END
) AS "0_4",

我有 2 栏

创建日期 -> 04-11-23 06:00:00.000000000 PM 星期六

更新日期 -> 04-11-23 08:00:00.000000000 PM 星期六

我想检查日期之间的小时数是否小于 4 或等于,并且之间的天数是否有“星期日”,如果有星期日,我想计算有多少个“星期日”,并从数量中减去两个日期之间的天数,

在这种情况下,两个日期之间的时间是,

EXTRACT(HOUR FROM (UPDATEDDATE - CREATEDDATE)) -- 2hrs

两个日期之间的天数是,

EXTRACT(DAY FROM (UPDATEDDATE - CREATEDDATE)) -- 0 days

这里的条件不满足,而且如果中间有周日,它也不起作用,代码逻辑是否正确?,需要帮助。谢谢你。

oracle-sqldeveloper
1个回答
0
投票

您不需要使用行生成器来查找所有日期,并且可以使用以下方法计算值:

SELECT -- Number of Sundays in the start week
       CASE
       WHEN TRUNC(created_date) - TRUNC(created_date, 'IW') <= 6 -- Sunday
       THEN 1
       END
       +
       -- Number of full weeks
       (TRUNC(updated_date, 'IW') - TRUNC(created_date, 'IW')) / 7
       -- Do not double count the first week
       - 1
       +
       -- 
       CASE
       WHEN TRUNC(created_date) - TRUNC(created_date, 'IW') < 6 -- Sunday
       THEN 0
       ELSE 1
       END
       AS number_of_sundays
FROM   table_name

对于样本数据:

CREATE TABLE table_name (created_date, updated_date) AS
  SELECT TIMESTAMP '2023-10-21 18:00:00.000000000',
         TIMESTAMP '2023-10-23 18:00:00.000000000'
  FROM   DUAL;

输出:

NUMBER_OF_SUNDAYS
1

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.