Maison >base de données >tutoriel mysql >Comment calculer les heures écoulées en tenant compte des heures de travail dans Oracle SQL ?

Comment calculer les heures écoulées en tenant compte des heures de travail dans Oracle SQL ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 20:42:15733parcourir

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

Calcul des heures basées sur les heures de travail dans Oracle SQL

Pour mesurer les heures écoulées entre les heures de début et de fin tout en tenant compte des contraintes d'heures de travail, nous avons besoin pour intégrer les limites des jours ouvrables dans nos calculs. Voici des approches pour y parvenir dans Oracle SQL :

Calcul direct avec ajustements des heures ouvrables :

Cette méthode calcule directement la différence horaire avec des ajustements basés sur les heures ouvrables définies :

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;

Requête hiérarchique avec jour ouvrable Génération :

Alternativement, nous pouvons générer une ligne pour chaque jour ouvrable et calculer les heures par jour, puis les additionner :

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;

Les deux méthodes considèrent du lundi au samedi 08 : De 00h00 à 18h00 comme heures de bureau. Assurez-vous d'ajuster la définition des heures d'ouverture dans les requêtes si vos heures d'ouverture diffèrent.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn