Mysql
 sql >> база данни >  >> RDS >> Mysql

Използвайки PHP Carbon, премахнете времето в секунди, когато два периода от време се припокриват

Това, което можете да направите, е да създадете DatePeriod на интервали от 1 секунда (предполагам, че това е критично за бизнеса, така че трябва да е до секунда) и проверете дали всяка секунда е в рамките на работното време на деня. Ако е, извадете го от общата сума.

Това обаче е ужасно неефективно. Например, само за цял ден ще трябва да направите 86400 чека. Става бавно бързо . Може би вместо това можете да използвате интервал от 1 минута или дори 1 час, ако вашите бизнес изисквания го позволяват, и да направите някои оценки. Както и да е, ето как можете да направите това:

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

Не споменавате дали уикендите са или не са работни дни за вас. Ако са, просто проверете дали текущият ден в повторението е събота или неделя и извадете всички тези секунди.

Можете да направите много оптимизации тук (кеширане на деня, например), но това трябва да ви отведе в правилната посока.

(Не мога да ви покажа демонстрация, защото не мога да use Carbon в типичните доставчици)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изберете последното съобщение между комуникацията на двама потребители в mysql

  2. Динамична опора MySQL

  3. Най-добра практика за проектиране на потребителски роли и система за разрешения?

  4. Как да инсталирате най-новия MySQL 8 на Debian 10

  5. Вземете последния ред за даден идентификатор