Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Używając PHP Carbon, usuń czas w sekundach, w którym dwa okresy nakładają się

Możesz zrobić DatePeriod z 1-sekundowymi interwałami (zakładam, że jest to krytyczne dla biznesu, więc musi być co do sekundy) i sprawdź, czy każda sekunda przypada w godzinach pracy danego dnia. Jeśli tak, odejmij ją od sumy.

Jest to jednak strasznie nieefektywne. Na przykład tylko na cały dzień musiałbyś wykonać 86400 czeków. Robi się wolno szybko . Może zamiast tego możesz użyć interwału 1 minuty lub nawet 1 godziny, jeśli pozwalają na to Twoje wymagania biznesowe, i dokonać pewnych szacunków. W każdym razie możesz to zrobić w następujący sposób:

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

Nie wspominasz, czy weekendy są dla Ciebie dniami roboczymi, czy nie. Jeśli tak, po prostu sprawdź, czy bieżący dzień w iteracji to sobota czy niedziela i odejmij wszystkie te sekundy.

Możesz tutaj dokonać wielu optymalizacji (na przykład buforowania dnia), ale powinno to skierować Cię we właściwym kierunku.

(Nie mogę pokazać Ci wersji demonstracyjnej, ponieważ nie mogę use Carbon u typowych dostawców)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Unikalny kod oparty na unikalnym adresie e-mail w tabeli mysql?

  2. Ustaw sesję z danymi pocztowymi

  3. Zapętlaj, aż hasło będzie unikalne

  4. Język zapytań Neo4j - Cypher

  5. Używanie $_SESSION do przenoszenia danych