sql >> Database teknologi >  >> RDS >> Oracle

Oracle-forespørgsel om at ekskludere weekender og 18.00 til 21.00

Du kan direkte beregne forskellen i dage (tilpasset fra mit svar her ):

SELECT start_date,
       end_date,
       ROUND(
         (
           -- Calculate the full weeks difference from the start of ISO weeks.
           ( TRUNC( end_date, 'IW' ) - TRUNC( start_date, 'IW' ) ) * (9/24) * (5/7)
           -- Add the full days for the final week.
           + LEAST( TRUNC( end_date ) - TRUNC( end_date, 'IW' ), 5 ) * (9/24)
           -- Subtract the full days from the days of the week before the start date.
           - LEAST( TRUNC( start_date ) - TRUNC( start_date, 'IW' ), 5 ) * (9/24)
           -- Add the hours of the final day
           + LEAST( GREATEST( end_date - TRUNC( end_date ) - 9/24, 0 ), 9/24 )
           -- Subtract the hours of the day before the range starts.
           - LEAST( GREATEST( start_date - TRUNC( start_date ) - 9/24, 0 ), 9/24 )
         )
         -- Multiply to give minutes rather than fractions of full days.
         * 24 * 60
       ) AS work_day_mins_diff
FROM   table_name;

Hvilket, for eksempeldata:

CREATE TABLE table_name ( start_date, end_date ) AS
SELECT DATE '2020-12-30' + INTERVAL '00' HOUR, DATE '2020-12-30' + INTERVAL '12' HOUR FROM DUAL UNION ALL
SELECT DATE '2020-12-30' + INTERVAL '18' HOUR, DATE '2020-12-30' + INTERVAL '20' HOUR FROM DUAL UNION ALL
SELECT DATE '2020-12-30' + INTERVAL '17:30' HOUR TO MINUTE, DATE '2020-12-30' + INTERVAL '21:30' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT DATE '2021-01-01' + INTERVAL '00' HOUR, DATE '2021-01-04' + INTERVAL '00' HOUR FROM DUAL UNION ALL
SELECT DATE '2021-01-02' + INTERVAL '00' HOUR, DATE '2021-01-04' + INTERVAL '00' HOUR FROM DUAL UNION ALL
SELECT DATE '2020-12-28' + INTERVAL '00' HOUR, DATE '2021-01-04' + INTERVAL '00' HOUR FROM DUAL UNION ALL
SELECT DATE '2020-12-28' + INTERVAL '00' HOUR, DATE '2020-12-29' + INTERVAL '00' HOUR FROM DUAL;

Udgange:

(Bruger ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS (DY)'; )

db<>fiddle her




  1. Sådan krypteres en visning i SQL Server

  2. Android Sqlite Indsæt, hvis den ikke findes

  3. MySql Table Indsæt hvis den ikke eksisterer ellers opdatere

  4. Er Intel dømt i serverens CPU-plads?