sql >> Database teknologi >  >> RDS >> Mysql

Brug PHP Carbon til at fjerne tid i sekunder, hvor to tidsperioder overlapper hinanden

Det du kan gøre er at lave en DatePeriod med 1 sekunds intervaller (jeg går ud fra, at dette er forretningskritisk, så det skal være til det andet) og kontroller, om hvert sekund er inden for døgnets åbningstid. Hvis det er det, skal du trække det fra totalen.

Dette er dog frygtelig ineffektivt. For eksempel, bare for en hel dag ville du skulle foretage 86400 checks. Det bliver langsomt hurtigt . Måske kan du i stedet bruge 1 minuts eller endda 1 times interval, hvis dine forretningskrav tillader det, og lave nogle skøn. I hvert fald, sådan kan du gøre dette:

<?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ævner ikke, om weekender er eller ikke er hverdage for dig. Hvis de er det, skal du bare kontrollere, om den aktuelle dag i iterationen er en lørdag eller søndag, og trække alle disse sekunder fra.

Du kan lave en masse optimeringer her (cache f.eks. dagen), men det burde få dig i den rigtige retning.

(Jeg kan ikke vise dig en demo, fordi jeg ikke kan use Carbon hos de typiske udbydere)




  1. Find nærmeste matchende strenge og dens understrenge ved hjælp af SQL-forespørgsel

  2. Lagring og hentning af billedsti i databasen mysql php

  3. Test af Android SQLite-databaseenhed

  4. MySQL Fire-And-Forget INSERT / UPDATE / DELETE - brug af mysql_unbuffered_query tilrådeligt?