2015-09-24 40 views
0

我必須創建一個php程序,顯示每個員工在選定的日期範圍,即2015年1月8日到2015年1月21日出席。我必須打印日期範圍內的每個日期然後將其關聯到該員工記錄的每個出勤日期。這裏的預期輸出:比較每個數組日期到mysql日期在php

DATE   am IN  am OUT   pm IN   pm OUT 

2015-01-08  08:13  17:51              
2015-01-09  08:08  11:57   13:03   17:10       
2015-01-10  08:18  08:20   11:20   12:01        
2015-01-11                   
2015-01-12  08:05  11:59   12:00   12:4          
2015-01-13  08:16  17:33   17:35            
2015-01-14  08:05  12:00   12:45   18:05       
2015-01-15  07:43  12:00   12:38   17:09        
2015-01-16                  
2015-01-17  08:29  12:45   16:57          
2015-01-18                  
2015-01-19  08:02  18:28             
2015-01-20           
2015-01-21  07:50  07:52   12:07   12:34 

但只能輸出是什麼,我可以這樣:

DATE   am IN  am OUT   pm IN   pm OUT 

2015-01-08  08:13  17:51              
2015-01-09  08:08  11:57   13:03   17:10       
2015-01-10  08:18  08:20   11:20   12:01                         
2015-01-12  08:05  11:59   12:00   12:4          
2015-01-13  08:16  17:33   17:35            
2015-01-14  08:05  12:00   12:45   18:05       
2015-01-15  07:43  12:00   12:38   17:09                        
2015-01-17  08:29  12:45   16:57                        
2015-01-19  08:02  18:28                      
2015-01-21  07:50  07:52   12:07   12:34 

由HR給我的要求也表明,他們有沒有出勤的日期。有人可以幫我解決這個問題。

+1

你是否已經嘗試通過你自己來解決這個問題?你使用了什麼代碼? – James

+0

是的,我用SQL查詢「SELECT * FROM出席WHERE EmployeeID =:employeeid和ValidDate BETWEEN日期(:fromDate)和日期(:toDate)ORDER BY ValidDate ASC」。 –

回答

0

取決於你是如何處理這個問題,你可以生成這樣的範圍內的所有日期在PHP中:

private function generateAllDates($from, $to){ 
    $from = gmdate("Y-m-d", strtotime($from)); 
    $to = gmdate("Y-m-d", strtotime($to)); 
    $allDates[] = $from; 
    $tempDate = $from; 
    while($tempDate < $to){ 
     $tempDate = gmdate("Y-m-d", strtotime("+1 day", trtotime($tempDate))); 
     $allDates[] = $tempDate; 
    } 
    return $allDates; 
} 

,然後每個日期輸出SQL數據或沒有。

另外,您可以生成所有日期等,並交與您的輸出連接:

CROSS JOIN (
    SELECT DISTINCT DATE_FORMAT(updated, '%Y-%m-%d') as day FROM YOUR_TABLE_NAME 
    WHERE updated BETWEEN "2015-07-09" - INTERVAL 60 DAY AND "2015-07-09" order by day DESC 
) dates 
+0

是的,我可以生成所有日期,如你發佈的日期,但我將如何將它與我的MySQL考勤記錄相關聯? –

+0

解答已更新。 –

+0

我可以使用sql查詢來執行上述功能嗎? –

1

使用LEFT JOIN而不是INNER JOIN,這樣做。

我想你在做employee INNER JOIN employee_attendance,而不是employee LEFT JOIN employee_attendance,它會獲取所有員工的結果,而不管它是否存在於employee_attendance中。

+0

在mysql表中,我只有員工參加的日期記錄。我想顯示結果,例如報告,顯示他們沒有出席所選範圍的日期。 –

+0

您必須有單獨的表格來保存員工數據和出席情況,對嗎? 你能分享一些來自表格的樣本記錄嗎? – MaK

+0

我剛纔看到您的查詢。您必須擁有員工表,其中包含employee_id,employee_name等等。 您可以修改您的查詢,如下所示: 'SELECT * FROM employee e LEFT JOIN參加a WHERE e.EmployeeID = a.EmployeeID WHERE a.EmployeeID =:employeeid AND a.ValidDate BETWEEN DATE(:fromDate)AND DATE :toDate)ORDER BY a.ValidDate ASC' – MaK