Berechnen von Stunden basierend auf Geschäftszeiten in Oracle SQL
Um die zwischen Start- und Endzeit verstrichenen Stunden unter Berücksichtigung von Geschäftszeitbeschränkungen zu messen, benötigen wir um Werktagsbeschränkungen in unsere Berechnungen einzubeziehen. Hier sind Ansätze, um dies in Oracle SQL zu erreichen:
Direkte Berechnung mit Geschäftszeitenanpassungen:
Diese Methode berechnet direkt die Stundendifferenz mit Anpassungen basierend auf definierten Geschäftszeiten:
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;
Hierarchische Abfrage mit Geschäftstag Generierung:
Alternativ können wir eine Zeile für jeden Werktag generieren und die Stunden pro Tag berechnen und sie dann summieren:
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;
Beide Methoden berücksichtigen Montag bis Samstag, 08: 00 bis 18:00 Uhr als Geschäftszeiten. Stellen Sie sicher, dass Sie die Definition der Geschäftszeiten in den Abfragen anpassen, wenn Ihre Geschäftszeiten abweichen.
Das obige ist der detaillierte Inhalt vonWie berechnet man die verstrichenen Stunden unter Berücksichtigung der Geschäftszeiten in Oracle SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!