sql >> データベース >  >> RDS >> Mysql

PHP Carbonを使用して、2つの期間が重なる秒単位の時間を削除します

    できることは、DatePeriodを作成することです 1秒間隔(これはビジネス上重要であると思いますので、秒単位である必要があります)で、1秒が1日の営業時間内であるかどうかを確認します。そうである場合は、合計から減算します。

    ただし、これはひどく非効率的です。たとえば、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);
    

    週末があなたにとって営業日であるかどうかについては言及しません。そうである場合は、反復の現在の日が土曜日か日曜日かを確認し、それらの秒をすべて減算します。

    ここでは多くの最適化を行うことができますが(たとえば、1日をキャッシュするなど)、正しい方向に進むはずです。

    use Carbonため、デモを表示できません。 一般的なプロバイダーで)




    1. MySQLの距離計算(簡単な解決策)

    2. SQLで重複を表示しない方法

    3. Postgresql更新時の現在のタイムスタンプ

    4. [最初の文字がBで始まる]すべてを選択します