2015-10-21 4 views
3

Я использовал несколько форм, чтобы установить длительность времени, в течение которого пользователь работал, а также получить количество сверхурочных, с которыми они работали. Проблема в том, что я хочу знать, сколько часов может быть оплачено в овертайме, и сколько - нормальное время. Теперь его довольно очевидно, вычесть сверхурочно от общего времени, однако я использовал следующий сценарий для получения времени суммы:Правильно вычитание времени на 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 минут. Таким образом, добавление работает, его значения просто не распознаются во временном формате.

+0

Мое первое предположение заключается в том, что вы неправильно используете функции даты. postgresql должен иметь возможность напрямую вычитать две даты друг от друга. результат должен быть чем-то вроде интервала. экстракт, с другой стороны, извлекает часть из даты, например, часовую часть. поэтому я предполагаю, что часть вашей проблемы основана на этом. может быть, этот связанный вопрос поможет вам http: // stackoverflow.com/questions/1964544/timestamp-difference-in-hours-for-postgresql – Joshua

+0

Я согласен с Джошуа. Вы должны иметь возможность сделать это с помощью своей базы данных. Но если вы хотите сделать это в php, вам действительно нужно посмотреть на объект и методы DateTime. Вычисление дат и такого самого себя довольно неприятно. Например, посмотрите http://php.net/manual/en/datetime.diff.php. –

+0

@Joshua Спасибо, ребята, прочел их сейчас, опубликует решение в ближайшее время –

ответ

1

Как я изложил в комментариях, целесообразно использовать классы 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 часов. Если это так, вы можете получить сумму сверхурочных.

+0

Я думаю, что мне нужно, чтобы мой SQL выполнял вычисления. В основном, когда он возвращает разность времени, а затем просто редактирует форматирование в php.После результата сообщения, как только я получу его работу –

+0

Это лучший вариант imho. Я дал свой ответ на PHP, потому что это то, что вы просили, но мое общее правило - всегда использовать функции вашей базы данных, когда это возможно. –

+0

Да, спасибо за ответ. Это заставило меня исследовать классы PHP DateTime, и я только сейчас понимаю, насколько это действительно важно. –

0

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

$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(); 

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

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

<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"; 

И теперь его working.The значения сложения идеально и перенос при необходимости.

Смежные вопросы