Mysql
 sql >> Base de données >  >> RDS >> Mysql

À l'aide de PHP Carbon, supprimez le temps en secondes où deux périodes se chevauchent

Ce que vous pouvez faire est de créer un DatePeriod d'intervalles de 1 seconde (je suppose que c'est critique pour l'entreprise, il doit donc être à la seconde) et vérifiez si chaque seconde se situe dans les heures ouvrables de la journée. Si c'est le cas, soustrayez-le du total.

C'est horriblement inefficace, cependant. Par exemple, pour une journée complète, vous devrez effectuer 86 400 chèques. Ça devient lent rapidement . Peut-être pouvez-vous plutôt utiliser un intervalle d'une minute ou même d'une heure si les besoins de votre entreprise le permettent, et faire des estimations. Quoi qu'il en soit, voici comment procéder :

<?php
use Carbon\Carbon;

$startTime = Carbon::create(2017, 9, 10, 8, 20, 0);
$endTime = Carbon::create(2017, 9, 10, 18, 35, 0);
$duration = $startTime->diffInSeconds($endTime, true);

$interval = new DateInterval("PT1S");
$period = new DatePeriod($startTime, $interval, $endTime);

$secondsToSubtract = 0;

foreach ($period as $second) {
    $businessStart = clone $second;
    $businessStart->setTime(8, 0); // start business day
    $businessEnd = clone $second;
    $businessEnd->setTime(17, 0); // end business day

    if (!($second > $businessStart && $second < $businessEnd)) { // if the second is not a "business second", subtract it
        $secondsToSubtract++;
    }
}
var_dump($secondsToSubtract);
$realDuration = $duration - $secondsToSubtract;
var_dump($realDuration);

Vous ne mentionnez pas si les week-ends sont ou non des jours ouvrables pour vous. Si c'est le cas, vérifiez simplement si le jour actuel de l'itération est un samedi ou un dimanche et soustrayez toutes ces secondes.

Vous pouvez faire de nombreuses optimisations ici (mise en cache de la journée, par exemple), mais cela devrait vous orienter dans la bonne direction.

(Je ne peux pas vous montrer de démo car je ne peux pas use Carbon chez les fournisseurs typiques)