Mengira Jam Berdasarkan Waktu Perniagaan dalam Oracle SQL
Untuk mengukur masa berlalu antara waktu mula dan tamat sambil mempertimbangkan kekangan waktu perniagaan, kami perlu untuk memasukkan had hari perniagaan ke dalam pengiraan kami. Berikut ialah pendekatan untuk mencapai perkara ini dalam Oracle SQL:
Pengiraan Terus dengan Pelarasan Waktu Perniagaan:
Kaedah ini mengira secara langsung perbezaan jam dengan pelarasan berdasarkan waktu perniagaan yang ditetapkan:
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;
Pertanyaan Hierarki dengan Hari Perniagaan Penjanaan:
Sebagai alternatif, kita boleh menjana satu baris untuk setiap hari perniagaan dan mengira jam setiap hari, kemudian menjumlahkannya:
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;
Kedua-dua kaedah mempertimbangkan Isnin hingga Sabtu, 08: 00 hingga 18:00 sebagai waktu perniagaan. Pastikan anda melaraskan definisi waktu perniagaan dalam pertanyaan jika waktu perniagaan anda berbeza.
Atas ialah kandungan terperinci Bagaimana Mengira Waktu Berlalu Mempertimbangkan Waktu Perniagaan dalam Oracle SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!