Rumah > pangkalan data > tutorial mysql > Bagaimana Mengira Waktu Berlalu Mempertimbangkan Waktu Perniagaan dalam Oracle SQL?

Bagaimana Mengira Waktu Berlalu Mempertimbangkan Waktu Perniagaan dalam Oracle SQL?

Barbara Streisand
Lepaskan: 2024-12-24 20:42:15
asal
721 orang telah melayarinya

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

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;
Salin selepas log masuk

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;
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan