sql >> Database >  >> RDS >> Mysql

Gebruik PHP Carbon om tijd in seconden te verwijderen waar twee tijdsperioden elkaar overlappen

Wat u kunt doen is een DatePeriod . maken intervallen van 1 seconde (ik neem aan dat dit bedrijfskritisch is, dus het moet tot de seconde zijn) en controleer of elke seconde binnen de kantooruren van de dag valt. Als dat zo is, trek het dan van het totaal af.

Dit is echter verschrikkelijk inefficiënt. Voor een volledige dag zou u bijvoorbeeld 86400 cheques moeten doen. Het wordt snel langzaam . Misschien kunt u in plaats daarvan een interval van 1 minuut of zelfs 1 uur gebruiken als uw zakelijke vereisten dit toestaan, en enkele schattingen maken. Hoe dan ook, dit is hoe je dit kunt doen:

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

U vermeldt niet of weekenden wel of geen werkdagen voor u zijn. Als dat zo is, controleer dan of de huidige dag in de iteratie een zaterdag of zondag is en trek al die seconden af.

Je kunt hier veel optimalisaties maken (bijvoorbeeld de dag cachen), maar het zou je in de goede richting moeten brengen.

(Ik kan je geen demo laten zien omdat ik geen use Carbon in de typische providers)




  1. Login script werkt niet op live server

  2. Maak een gekoppelde server in SQL Server (T-SQL-voorbeeld)

  3. verander mysql in pdo en sla het resultaat op in variabele

  4. String naar joda LocalDate in de notatie dd-MMM-yy