我想检查 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
这里的条件不满足,而且如果中间有周日,它也不起作用,代码逻辑是否正确?,需要帮助。谢谢你。
您不需要使用行生成器来查找所有日期,并且可以使用以下方法计算值:
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 |