Рассмотрим следующий грубый пример ...
Пример схемы (заимствовано и адаптировано из P.Salmon):
DROP TABLE IF EXISTS employee_leave;
CREATE TABLE employee_leave
(leave_id SERIAL PRIMARY KEY
,employee_id INT NOT NULL
,leave_from DATE NOT NULL
,leave_to DATE NOT NULL
);
INSERT INTO employee_leave
(employee_id
,leave_from
,leave_to
) VALUES
(11,'2019-05-30','2019-06-02'),
(11,'2019-06-05','2019-06-05'),
(11,'2019-06-06','2019-06-06'),
(11,'2019-06-30','2019-07-11'),
(12,'2019-05-30','2019-07-11'),
(13,'2019-05-11','2019-05-12');
Пример кода:
<?php
include('path/to/connection/stateme.nts');
$query = "
SELECT employee_id
, leave_from
, leave_to
, datediff(leave_to,leave_from)+1 days
FROM employee_leave
ORDER
BY employee_id
, leave_from; -- ORDER BY is not strictly necessary, as the ordering can be done in presentation code.
";
$result = mysqli_query($conn,$query);
$array = array();
while($row = mysqli_fetch_assoc($result)){
$array[] = $row;
}
$new_array = array();
foreach($array as $k=>$v){
if($v['days']>1){
$days = ' days'; } else { $days = ' day'; }
$new_array[$v['employee_id']][] = $v['leave_from'].' - '.$v['leave_to'].' ('.$v['days'].$days.')';
}
print_r($new_array);
?>
Используя схему выше, этот код выводит ...
Array
(
[11] => Array
(
[0] => 2019-05-30 - 2019-06-02 (4 days)
[1] => 2019-06-05 - 2019-06-05 (1 day)
[2] => 2019-06-06 - 2019-06-06 (1 day)
[3] => 2019-06-30 - 2019-07-11 (12 days)
)
[12] => Array
(
[0] => 2019-05-30 - 2019-07-11 (43 days)
)
[13] => Array
(
[0] => 2019-05-11 - 2019-05-12 (2 days)
)
)
Обратите внимание, что этот результат рассматривает все дни как рабочие дни