SQL - 日期范围返回所有数据

时间:2014-01-11 06:05:23

标签: mysql sql

我有一个简单的PHP网络应用程序,用于每日出席empployee 我有一个名为emp_master的表,它将拥有所有员工数据 例如

emp_id   emp_name
1001     Abby
1002     Buub

另一个名为timesheet_tran的表,甚至在员工登录系统时都有dailt事务

timesheet_tran table
date       emp_id 
02/01/14   1001
02/01/14   1002
03/01/14   1001
04/01/14   1001
04/01/14   1002

我试图找出一个返回数据的查询,在日期范围之间显示所有在日期范围之间记录/未记录的员工。

我需要显示

emp_id   date      absent/present
1001     02/01/14  present
1002     02/01/14  present
1001     03/01/14  present
1002     03/01/14  absent

我试过

SELECT m.emp_id,t.date FROM timesheet_tran as t RIGHT OUTER JOIN emp_master m ON t.date BETWEEN '02/01/14' AND '04/01/14' AND t.emp_id = m.emp_id

但我需要提到每个日期的记录。

2 个答案:

答案 0 :(得分:1)

SELECT m.emp_id,t.date 
FROM timesheet_tran as t 
RIGHT OUTER JOIN emp_master m ON t.date 
AND t.date BETWEEN '2014-02-01' AND '2014-04-01'
 AND t.emp_id = m.emp_id

编辑:根据您更新的评论,您需要以列出的方式查询所有用户的联接,无论他们是否存在。

SELECT m.emp_id,t.date 
FROM emp_master as m 
LEFT JOIN timesheet_tran t ON date

这将列出所有用户条目。如果时间表数据不存在,则返回null。然后,您可以根据需要将其转换为字符串缺席/存在。

    SELECT m.emp_id, 
CASE WHEN t.date IS NOT NULL 
       THEN 'present'
       ELSE 'absent'
END AS T_date
FROM emp_master as m 
LEFT JOIN timesheet_tran t ON date

答案 1 :(得分:1)

尝试这样

Select emp_id,emp_name,Date1,(
CASE WHEN EXISTS(
sELECT emp_id FROM timesheet_tran AT WHERE T.emp_id =AT.emp_id AND T.date1=AT.date
) then 'Present' Else 'Absent' End )as Status
FROM
(
Select emp_id ,emp_name,Cast(date as DATE)AS DATE1 from emp_master a,(Select Distinct date    from timesheet_tran ) b
) T

SQL FIDDLE DEMO

希望这能帮到你