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
Libérer: 2025-01-01 09:21:10
original
157 Les gens l'ont consulté

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;
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal