Heim > Datenbank > MySQL-Tutorial > Wie berechnet man die verstrichenen Stunden unter Berücksichtigung der Geschäftszeiten in Oracle SQL?

Wie berechnet man die verstrichenen Stunden unter Berücksichtigung der Geschäftszeiten in Oracle SQL?

Barbara Streisand
Freigeben: 2024-12-24 20:42:15
Original
721 Leute haben es durchsucht

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

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage