2014-09-30 136 views
1

我對此有一段時間了。我一直在尋找,我看到不同的東西,我可以使用像CAST,date() function,SUM,Javascript數學等問題是我不知道哪一個使用或哪一個我會用在我的情況。我越是閱讀不同的線索和「解決方案」,我就越困惑於如何將其應用於我的需求。我有一個簡單的時間表在我的數據庫中稱爲「時間表」在它我有列entry_id(AI),user_id,名字,姓氏,衝(日期時間)和評論(進出)。我已經在PHP中做了一個簡單的查詢來將用戶時間表引入下面的HTML表格中。 timesheet table HTML在while語句中計算時間表中的時間PHP/MYSQL

在我的PHP查詢中,我運行了一條WHILE語句來遍歷記錄。因爲我正在使用一個循環,所以我不知道如何計算給出該時間段的總工作時間的時間。

這裏是我的查詢:

$timesheet = mysqli_query($connect, "SELECT DATE_FORMAT(punch, '%Y/%m/%d') AS punch_date, DATE_FORMAT(punch, '%H:%i:%s') AS punch_time, comment 
        FROM timesheet WHERE user_id = '$employee' AND punch BETWEEN '$fromDate' AND '$toDate'") or die('Error: ' . mysqli_error($connect)); 

if(mysqli_num_rows($timesheet)>0){ 
    $output = '<table class="table table-striped"> 
        <thead> 
        <tr> 
         <th>Date</th> 
         <th>Time</th> 
         <th>Status</th> 
        </tr> 
        </thead> 
        <tbody>'; 
    while ($row = mysqli_fetch_array($timesheet, MYSQL_ASSOC)) { 

     $date = $row['punch_date']; 
     $time = $row['punch_time']; 
     $status = $row['comment']; 

     $output .= '<tr> 
         <td>' . $date . '</td> 
         <td '; 
     if($status === 'In'){ 
      $output .= 'class="in-time"'; 
     } elseif($status === 'Out') { 
      $output .= 'class="out-time"'; 
     } 

     $output .= '>' . $time . '</td> 
         <td>' . $status . '</td> 
        </tr>'; 

    } //end while 

    $output .= '</tbody> 
       </table>'; 


    echo $output; 

} //end if mysqli_num_rows 

它甚至可以計算在一個循環的時間?如果是的話,你會介意給出一個例子,而不是你能指出我在哪裏/我做什麼的方向是錯誤的?

UPDATE: 每次進入都有或進或出的狀態,所以我需要獲得各組進出的差異,然後添加在一起,得到的時間總數的工作爲時間段。歸根結底,這是我需要完成(見紅色總在表的底部) Hopeful outcome

的這裏是數據庫表「時間表」 database

回答

2

的快照,而()之前,我們必須決定是否使用所有行來計算總時間。

因爲這裏有一個問題。如果用戶已經登錄但尚未註銷,該怎麼辦?

在這種情況下,我們不會使用最後一次登錄時間。所以:

$iterations = mysqli_num_rows($timesheet) % 2 == 0 ? mysqli_num_rows($timesheet) : mysqli_num_rows($timesheet) - 1; 

在你的while循環中,將punch_time轉換爲秒。

while() { 

... 

$parts = explode(':', $row['punch_time']); 

$seconds = (int) $parts[0] * 3600 + (int) $parts[1] * 60 + (int) $parts[2]; 

if($status === 'In'){ 

    $output .= 'class="in-time"'; 

    $total -= $iterations ? $seconds : 0; // Subtract from total when in and there is out coming 

} else if($status === 'Out') { 

    $output .= 'class="out-time"'; 

    $total += $seconds; // Add to total when out 
} 

... 

$iterations--; 

} 

的循環,可以改變秒到你想要的格式後,通過使用

$hours = floor($total/3600); 

$minutes = floor(($total/60) % 60); 

$seconds = $total % 60; 

echo "$hours:$minutes:$seconds"; 
+0

哇,一爲creativetity,謝謝!我有一個快速的問題 - 當使用上面的圖像作爲參考,當我回聲$總數(仍然以秒爲單位)時,我得到202851秒,當它轉換成小時時,它會達到56.3475小時。所以在某處轉換是錯誤的。在圖像中,如果我手工計算數據,它大致會顯示總共15分鐘的工作時間,這將轉換爲0.25小時。那個問題在哪裏? – Derek 2014-09-30 13:10:24

+0

你是對的!計算錯了。我認爲這會做到這一點。你的情況是56:16:51。 – tliokos 2014-09-30 13:23:06

+0

非常感謝您的幫助,我發現您的代碼將添加總時間條目並將結果作爲總數。我已經更新了這個問題,希望能夠更清楚地解釋我的問題。希望這會對預期結果產生一些影響,迄今爲止,您一直非常有幫助。每個條目都有一個In或Out的狀態,我需要做的是找出每個In和Out條目之間的時間差異,然後我將這些條目加在一起以獲得在這個時間段內工作的總時間,以小時爲單位。 – Derek 2014-09-30 15:14:51