Я использовал несколько форм, чтобы установить длительность времени, в течение которого пользователь работал, а также получить количество сверхурочных, с которыми они работали. Проблема в том, что я хочу знать, сколько часов может быть оплачено в овертайме, и сколько - нормальное время. Теперь его довольно очевидно, вычесть сверхурочно от общего времени, однако я использовал следующий сценарий для получения времени суммы:Правильно вычитание времени на 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();
Функция Extract хорошо работает, чтобы показать время, но когда я начинаю вычитаюсь его, где он получает бит беспорядочный.
$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 минут. Таким образом, добавление работает, его значения просто не распознаются во временном формате.
Мое первое предположение заключается в том, что вы неправильно используете функции даты. postgresql должен иметь возможность напрямую вычитать две даты друг от друга. результат должен быть чем-то вроде интервала. экстракт, с другой стороны, извлекает часть из даты, например, часовую часть. поэтому я предполагаю, что часть вашей проблемы основана на этом. может быть, этот связанный вопрос поможет вам http: // stackoverflow.com/questions/1964544/timestamp-difference-in-hours-for-postgresql – Joshua
Я согласен с Джошуа. Вы должны иметь возможность сделать это с помощью своей базы данных. Но если вы хотите сделать это в php, вам действительно нужно посмотреть на объект и методы DateTime. Вычисление дат и такого самого себя довольно неприятно. Например, посмотрите http://php.net/manual/en/datetime.diff.php. –
@Joshua Спасибо, ребята, прочел их сейчас, опубликует решение в ближайшее время –