2015-09-24 21 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