Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

tạo chức năng tùy chỉnh cho sự khác biệt về ngày không bao gồm cuối tuần và ngày lễ trong oracle sql

Bạn không cần phải sử dụng trình tạo hàng để liệt kê mỗi ngày để có được số ngày trong tuần - điều này có thể được thực hiện bằng một phép tính đơn giản:

Từ câu trả lời của tôi ở đây:

CREATE FUNCTION getWorkingDays (
  in_start_date IN  DATE,
  in_end_date   IN  DATE
) RETURN NUMBER DETERMINISTIC
IS
  p_start_date   DATE;
  p_end_date     DATE;
  p_working_days NUMBER;
  p_holiday_days NUMBER;
BEGIN
  IF in_start_date IS NULL OR in_end_date IS NULL THEN
    RETURN NUll;
  END IF;

  p_start_date := LEAST( in_start_date, in_end_date );
  p_end_date   := GREATEST( in_start_date, in_end_date );

  -- 5/7 * ( Number of days between monday of the week containing the start date
  --         and monday of the week containing the end date )
  -- + LEAST( day of week for end date, 5 )
  -- - LEAST( day of week for start date, 5 )
  p_working_days := ( TRUNC( p_end_date, 'IW' ) - TRUNC( p_start_date, 'IW' ) ) * 5 / 7
                    + LEAST( p_end_date - TRUNC( p_end_date, 'IW' ), 5 )
                    - LEAST( p_start_date - TRUNC( p_start_date, 'IW' ), 5 );

  SELECT COALESCE(
           SUM(
             LEAST( p_end_date, holiday_date + INTERVAL '1' DAY )
             - GREATEST( p_start_date, holiday_date )
           ),
           0
         )
  INTO   p_holiday_days
  FROM   Holidays
  WHERE  HOLIDAY_DATE BETWEEN TRUNC( p_start_date )
                      AND     TRUNC( p_end_date )
  AND    HOLIDAY_DATE - TRUNC( HOLIDAY_DATE, 'IW' ) < 5;

  RETURN GREATEST( p_working_days - p_holiday_days, 0 );
END;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách khôi phục cơ sở dữ liệu bằng RMAN

  2. Cài đặt để xem phần thời gian với ngày trong nhà phát triển Oracle PL / SQL là gì?

  3. Sự khác biệt giữa USER () và SYS_CONTEXT ('USERENV', 'CURRENT_USER') là gì?

  4. Cách chính xác để cấp cho người dùng quyền truy cập vào các lược đồ bổ sung trong Oracle

  5. có chức năng nào để dịch dữ liệu trong sql không