【发布时间】:2021-12-31 14:58:37
【问题描述】:
函数 number_of_days(start_date, end_date) 应该计算 start_date 和 end_date 之间的工作日数。只要不是星期日,它适用于任何 start_date。
计算有3个步骤:
-
取整周前的天数(对于 21 日至 24 日等小范围日期,整周可以为 0)
-
然后它会增加整周
-
将整周后剩余的所有天数加起来。
我需要第二步来生成像 0、5、10 这样的整数,而不是在这个例子中我得到 0,7142857142857142857142857142857142857,因为 start_date 参数是星期天。
我可以使用 ROUND() 来解决它,但也许有更好的方法?
CREATE OR REPLACE FUNCTION number_of_days(start_date IN DATE, end_date IN DATE)
RETURN NUMBER
IS v_number_of_days NUMBER;
first_week_day DATE := TO_DATE('31-12-2017', 'DD-MM-YYYY');
BEGIN
--step 1
SELECT ( CASE WHEN MOD(start_date - first_week_day, 7) BETWEEN 2 AND 5
THEN 6 - MOD(start_date - first_week_day, 7)
ELSE 0 END )
+
--step 2
(( CASE WHEN MOD(end_date - first_week_day, 7) < 7
THEN end_date - MOD(end_date - first_week_day, 7)
ELSE end_date END )
-
( CASE WHEN MOD(start_date - first_week_day, 7) > 1
THEN start_date + 8 - MOD(start_date - first_week_day, 7)
ELSE start_date END ) + 1
) / 7 * 5
+
--step 3
( CASE WHEN MOD(end_date - first_week_day,7) BETWEEN 1 AND 6
THEN CASE WHEN MOD(end_date - first_week_day, 7) = 6
THEN MOD(end_date - first_week_day, 7) - 1
ELSE MOD(end_date - first_week_day, 7) END
ELSE 0 END )
INTO v_number_of_days
FROM DUAL;
RETURN v_number_of_days;
END;
--test
SELECT number_of_days(TO_DATE('21-11-2021', 'DD-MM-YYYY'), TO_DATE('24-11-2021', 'DD-MM-YYYY'))
FROM DUAL;
【问题讨论】:
-
javascript在所有这些中起到什么作用?
标签: sql oracle plsql oracle11g