sql >> Databasteknik >  >> RDS >> Mysql

Använd PHP Carbon, ta bort tid i sekunder där två tidsperioder överlappar varandra

Vad du kan göra är att skapa en DatePeriod med 1 sekunds intervall (jag antar att detta är affärskritiskt, så det måste vara till det andra) och kontrollera om varje sekund är inom arbetstiden på dygnet. Om det är det, subtrahera det från summan.

Detta är dock fruktansvärt ineffektivt. Till exempel, bara för en hel dag skulle du behöva göra 86400 kontroller. Det går långsamt snabbt . Kanske kan du istället använda 1 minuts eller till och med 1 timmes intervall om dina affärskrav tillåter det, och göra några uppskattningar. Hur som helst, så här kan du göra detta:

<?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);

Du nämner inte om helger är eller inte är arbetsdagar för dig. Om de är det, kontrollera bara om den aktuella dagen i iterationen är en lördag eller söndag och subtrahera alla dessa sekunder.

Du kan göra många optimeringar här (cacha dagen till exempel), men det borde ta dig i rätt riktning.

(Jag kan inte visa dig en demo eftersom jag inte kan use Carbon hos de typiska leverantörerna)




  1. ändra tabellsläppkolumn i Oracle-databasen

  2. mysql SKAPA ANVÄNDARE

  3. MySQL felaktigt strängvärde fel vid spara unicode sträng i Django

  4. Kan jag utföra en transaktion över två MySQL-databaser?