Oracle
 sql >> база данни >  >> RDS >> Oracle

Заявка на Oracle за изключване на почивните дни и от 18:00 до 21:00

Можете директно да изчислите разликата в дни (адаптирано от моя отговор тук ):

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;

Което за примерните данни:

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;

Изходи:

(Използвайки ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS (DY)'; )

db<>fiddle тук




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle 11 Index само за част от данните

  2. Как да добавите клауза where към обект на изрична таблица за присъединяване на Hibernate @OneToMany?

  3. Определете дали датата на Oracle е в уикенд?

  4. Използване на кортежи в клауза ORACLE IN и условие за един елемент в кортежа

  5. Разлика между клаузите ON и WHERE в съединенията на SQL таблица