Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sử dụng PHP Carbon, loại bỏ thời gian tính bằng giây khi hai khoảng thời gian trùng lặp

Những gì bạn có thể làm là tạo DatePeriod khoảng thời gian 1 giây (tôi cho rằng điều này là quan trọng trong kinh doanh, vì vậy nó phải là giây) và kiểm tra xem mỗi giây có nằm trong giờ làm việc trong ngày hay không. Nếu đúng, hãy lấy tổng trừ đi.

Tuy nhiên, điều này là khủng khiếp không hiệu quả. Ví dụ, chỉ trong một ngày, bạn phải thực hiện 86400 lần kiểm tra. Nó trở nên chậm nhanh chóng . Thay vào đó, có thể bạn có thể sử dụng khoảng thời gian 1 phút hoặc thậm chí 1 giờ nếu yêu cầu kinh doanh của bạn cho phép và đưa ra một số ước tính. Dù sao, đây là cách bạn có thể làm điều này:

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

Bạn không đề cập đến việc các ngày cuối tuần có phải là ngày làm việc của bạn hay không. Nếu đúng như vậy, chỉ cần kiểm tra xem ngày hiện tại trong lần lặp lại là Thứ Bảy hay Chủ Nhật và trừ tất cả những giây đó.

Bạn có thể thực hiện nhiều tối ưu hóa ở đây (ví dụ:vào bộ nhớ đệm trong ngày), nhưng nó sẽ giúp bạn đi đúng hướng.

(Tôi không thể cho bạn xem bản demo vì tôi không thể use Carbon trong các nhà cung cấp điển hình)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trả về các bản ghi cha với các bản ghi con bằng các giá trị cụ thể VÀ trong đó tổng tập các bản ghi con cho một cha mẹ nhất định bằng một giá trị cụ thể

  2. Cách mở rộng trường được phân tách bằng dấu phẩy thành nhiều hàng trong MySQL

  3. Sử dụng nhiều cột làm mã định danh duy nhất cho mysql

  4. php 5.x 7.x, lỗi ssl pdo:Chứng chỉ ngang hàng CN =`someName 'không khớp với mong đợi CN =' someIP '

  5. MySQL thay thế tất cả các khoảng trắng bằng -