postgresql — правильно вычитает время в PHP

Я использовал несколько форм, чтобы установить продолжительность времени, в течение которого пользователь работал, а также получить количество сверхурочной работы, которую он проработал. Проблема в том, что я хочу знать, сколько часов можно оплачивать сверхурочно, а сколько — нормальное время. Теперь это довольно очевидно, вычесть сверхурочные из общего времени, однако я использовал следующий скрипт для получения суммы времени:

$logtime = new CGenRs("SELECT time_id,
profile_id ,
user_number ,
start_time ,
end_time,
description,
exported,ovt_start_time,ovt_end_time, EXTRACT(hour FROM(end_time - start_time)) as diff,EXTRACT(minute FROM(end_time - start_time))as difference,EXTRACT(hour FROM(ovt_end_time-ovt_start_time)) as ovt_diff,EXTRACT(minute FROM(ovt_end_time-ovt_start_time)) as ovt_difference from adapt_profile_time where exported = 'f' order by user_number", $cao);
$logtime->first();

Функция извлечения хорошо работает, чтобы показать время, но когда я начинаю вычитать ее, она становится немного грязной.

$tot_mins = 0;
$ovt_mins = 0;
}
$tot_mins = ($tot_mins + $logtime->valueof('diff') * 60) + $logtime->valueof('difference');
$ovt_mins = ($ovt_mins + $logtime->valueof('ovt_diff') * 60) + $logtime->valueof('ovt_difference');
$total_test= floor(($tot_mins / 60)-($ovt_mins / 60))." hours ".(($tot_mins % 60)-($ovt_mins % 60))." minutes ";

При использовании echo $total_test он выполняет вычисления, но если пользователь отработал 7 часов 0 минут, что состоит из 3 часов 40 минут сверхурочной работы, результат вышеуказанного расчета вернет 3 часа -40 минут. Что не так.
Так где я здесь не так?

Я полагаю, что проблема заключается в том, что часы и минуты ЭКСТРАКТА плохо работают с операторами «-» «+». Я добавил общий столбец в мою таблицу, который добавляет общее время с овертаймом (должно быть вычтено, но я сделал это для проверки), я использовал следующий код:

<td><?php echo ($logtime->valueof('diff')   +  $logtime->valueof('ovt_diff')) . " " . "hours" . " ".(($logtime->valueof('difference') + $logtime->valueof('ovt_difference')))." "."minutes"  ?></td>

Результат был интересным. Если пользователь работал 3 часа 50 минут, из которых все было сверхурочно, возвращаемый результат составлял 6 часов 100 минут. Таким образом, дополнение работает, его значения не распознаются во временном формате.

3

Решение

Как я уже говорил в комментариях, разумно использовать DateTime классы для любых действий даты / времени, которые вы хотите сделать. В том числе получать разницу между временами.

Проверьте этот пример:

// Create two new DateTime-objects...
$Date1 = new DateTime('2015-10-21T8:00:00');
$Date2 = new DateTime('2015-10-21T18:30:00');

// The diff-methods returns a new DateInterval-object...
$Diff = $Date2->diff($Date1);

// Call the format method on the DateInterval-object
echo $Diff->format('%h:%i');

Выход из кода выше должен быть «10:30»

С этого момента вы можете просто узнать разницу между временем и проверить, не превышает ли это 8 часов. Если это так, вы можете получить сумму сверхурочных.

1

Другие решения

В конце концов я получил это работает. Я изменил свой запрос на следующее:

$logtime = new CGenRs("SELECT time_id,
profile_id ,
user_number ,
start_time ,
end_time,
description,
exported,ovt_start_time,ovt_end_time, EXTRACT(hour FROM(end_time - start_time)) as diff,EXTRACT(minute FROM(end_time - start_time))as difference ,EXTRACT(hour FROM(ovt_end_time-ovt_start_time)) as ovt_diff,EXTRACT(minute FROM(ovt_end_time-ovt_start_time)) as ovt_difference,EXTRACT(EPOCH FROM (end_time - start_time)) as super,EXTRACT(EPOCH FROM (ovt_end_time - ovt_start_time)) as spar FROM adapt_profile_time where exported = 'f' order by user_number", $cao);
$logtime->first();

Как вы можете видеть, я добавил EXTRACT Epoch на запрос как по времени, так и по общему времени работы.

Затем я добавил следующий фрагмент кода:

<td><?php $epoch_1 = $logtime->valueof('super');
$epoch_2 = $logtime->valueof('spar');
$diff_seconds = $epoch_1 - $epoch_2;
$diff_weeks = floor($diff_seconds / 604800);
$diff_seconds -= $diff_weeks * 604800;
$diff_days = floor($diff_seconds / 86400);
$diff_seconds -= $diff_days * 86400;
$diff_hours = floor($diff_seconds / 3600);
$diff_seconds -= $diff_hours * 3600;
$diff_minutes = floor($diff_seconds / 60);
$diff_seconds -= $diff_minutes * 60;
echo $diff_hours." "."hours ".$diff_minutes." minutes" ?></td>
<td>

И поэтому я получил правильные значения для отображения в таблице.
После этого я изменил код в своем вопросе следующим образом:

$tot_mins = 0;
$ovt_mins = 0;
$total_mens = ($logtime->valueof('super') /60 ) + ($logtime->valueof('spar')/60);


while (!$logtime->eof()) {
while (!$logtime->eof()) {


if ($curr_userno != $logtime->valueof('user_number')) {
$total_time = floor($tot_mins / 60) . " hours " . ($tot_mins % 60) . " minutes";
$total_ovt = floor($ovt_mins / 60) . " hours " . ($ovt_mins % 60) . " minutes";
$total_test = floor($total_mens/60)." hours ".($total_mens%60). " minutes";

И теперь это работает. Ценности прекрасно складываются и переносятся, когда это необходимо.

0

По вопросам рекламы [email protected]