Maison >base de données >tutoriel mysql >Comment calculer les heures ouvrables entre deux dates dans Oracle SQL ?

Comment calculer les heures ouvrables entre deux dates dans Oracle SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-01 09:21:10165parcourir

How to Calculate Business Hours Between Two Dates in Oracle SQL?

Calculer les heures en fonction des heures ouvrables dans Oracle SQL

Dans Oracle SQL, le calcul des heures entre deux périodes peut être simple. Cependant, si vous devez prendre en compte les heures d'ouverture, le calcul devient plus complexe.

Spécifications des heures d'ouverture

Les heures d'ouverture fournies sont du lundi au samedi à partir de 8h00. Du matin à 18h00. Pour incorporer ces heures dans le calcul, vous pouvez utiliser une combinaison de manipulation de date et de logique conditionnelle.

Requête SQL

La requête SQL suivante fournit une solution pour calculer les heures sur la base de l'activité spécifiée heures :

SELECT task,
       start_time,
       end_time,
       ROUND(
         (
           -- Calculate the full weeks difference from the start of ISO weeks.
           ( TRUNC( end_time, 'IW' ) - TRUNC( start_time, 'IW' ) ) * (10/24) * (6/7)
           -- Add the full days for the final week.
           + LEAST( TRUNC( end_time ) - TRUNC( end_time, 'IW' ), 6 ) * (10/24)
           -- Subtract the full days from the days of the week before the start date.
           - LEAST( TRUNC( start_time ) - TRUNC( start_time, 'IW' ), 6 ) * (10/24)
           -- Add the hours of the final day
           + LEAST( GREATEST( end_time - TRUNC( end_time ) - 8/24, 0 ), 10/24 )
           -- Subtract the hours of the day before the range starts.
           - LEAST( GREATEST( start_time - TRUNC( start_time ) - 8/24, 0 ), 10/24 )
         )
         -- Multiply to give minutes rather than fractions of full days.
         * 24,
         15 -- Number of decimal places
       ) AS work_day_hours_diff
FROM   your_table;

Explication

  • Semaines : La requête calcule d'abord les semaines complètes dans la plage à l'aide de TRUNC( end_time, 'IW' ) et TRUNC( start_time, 'IW' ). Ces calculs donnent les dates de début et de fin des semaines ISO contenant le début et la fin de la tâche.
  • Jours : Les fonctions LEAST() et GREATEST() permettent de prendre en compte les parties jours en début et en fin de plage, où les horaires d'ouverture peuvent ne pas s'appliquer.
  • Horaires : La différence en heures pour le dernier jour et la veille les débuts de plage sont calculés de la même manière.
  • Multiplication : Le calcul final multiplie le résultat par 24 pour convertir les minutes en heures.

Exemples de données et Sortie

Avec les exemples de données fournis :

TASK | START_TIME | END_TIME
A | 16-JAN-17 10:00 | 23-JAN-17 11:35
B | 18-JAN-17 17:53 | 19-JAN-17 08:00
C | 13-JAN-17 13:00 | 17-JAN-17 14:52
D | 21-JAN-17 10:00 | 30-JAN-17 08:52

Les sorties de la requête les résultats suivants :

TASK START_TIME END_TIME WORK_DAY_HOURS_DIFF
A 2017-01-16 10:00:00 (MON) 2017-01-23 11:35:00 (MON) 61.583333333333333
B 2017-01-18 17:53:00 (WED) 2017-01-19 08:00:00 (THU) .116666666666667
C 2017-01-13 13:00:00 (FRI) 2017-01-17 14:52:00 (TUE) 31.866666666666667
D 2017-01-21 10:00:00 (SAT) 2017-01-30 08:52:00 (MON) 68.866666666666667

Ces résultats reflètent avec précision le nombre d'heures de travail en fonction des heures d'ouverture spécifiées.

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