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 중국어 웹사이트의 기타 관련 기사를 참조하세요!