>데이터 베이스 >MySQL 튜토리얼 >Oracle SQL에서 업무 시간을 고려하여 경과 시간을 계산하는 방법은 무엇입니까?

Oracle SQL에서 업무 시간을 고려하여 경과 시간을 계산하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-24 20:42:15733검색

How to Calculate Elapsed Hours Considering Business Hours in Oracle SQL?

Oracle SQL에서 업무 시간을 기준으로 시간 계산

업무 시간 제약을 고려하면서 시작 시간과 종료 시간 사이의 경과 시간을 측정하려면 다음이 필요합니다. 영업일 제한을 계산에 포함합니다. Oracle SQL에서 이를 달성하기 위한 접근 방식은 다음과 같습니다.

업무 시간 조정을 통한 직접 계산:

이 방법은 정의된 업무 시간을 기준으로 조정하여 시간 차이를 직접 계산합니다.

SELECT task,
       start_time,
       end_time,
       ROUND(
         (
           -- Calculate full weeks difference from start of ISO weeks.
           ( TRUNC( end_time, 'IW' ) - TRUNC( start_time, 'IW' ) ) * (10/24) * (6/7)
           -- Add full days for the final week.
           + LEAST( TRUNC( end_time ) - TRUNC( end_time, 'IW' ), 6 ) * (10/24)
           -- Subtract full days from days of the week before the start date.
           - LEAST( TRUNC( start_time ) - TRUNC( start_time, 'IW' ), 6 ) * (10/24)
           -- Add hours of final day
           + LEAST( GREATEST( end_time - TRUNC( end_time ) - 8/24, 0 ), 10/24 )
           -- Subtract hours of the day before the range starts.
           - LEAST( GREATEST( start_time - TRUNC( start_time ) - 8/24, 0 ), 10/24 )
         )
         -- Multiply to give minutes instead of fractions of full days.
         * 24,
         15 -- Number of decimal places
       ) AS work_day_hours_diff
FROM   your_table;

영업일을 사용한 계층적 쿼리 생성:

또는 각 영업일에 대해 하나의 행을 생성하고 하루 시간을 계산한 다음 합계를 낼 수 있습니다.

SELECT task,
       COALESCE( SUM( end_time - start_time ), 0 ) * 24 AS total_hours
FROM   (
  SELECT task,
         GREATEST( t.start_time, d.column_value + INTERVAL '8' HOUR ) AS start_time,
         LEAST( t.end_time, d.column_value + INTERVAL '18' HOUR ) AS end_time
  FROM   your_table t
         LEFT OUTER JOIN
         TABLE(
           CAST(
             MULTISET(
               SELECT TRUNC( t.start_time + LEVEL - 1 )
               FROM   DUAL
               WHERE  TRUNC( t.start_time + LEVEL - 1 ) - TRUNC( t.start_time + LEVEL - 1, 'iw' ) < 6
               CONNECT BY TRUNC( t.start_time + LEVEL - 1 ) < t.end_time
             ) AS SYS.ODCIDATELIST
           )
         ) d
         ON (   t.end_time   > d.column_value + INTERVAL  '8' HOUR
            AND t.start_time < d.column_value + INTERVAL '18' HOUR )
)
GROUP BY task;

두 방법 모두 월요일부터 토요일까지 8을 고려합니다. 영업시간은 00시부터 18시까지입니다. 업무 시간이 다른 경우 쿼리에서 업무 시간 정의를 조정하세요.

위 내용은 Oracle SQL에서 업무 시간을 고려하여 경과 시간을 계산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.