2012-12-26 44 views
0

的给定范围内的员工没有报告我有两个表硕士(empname,EMPID)所组成的全体员工和另一台交易(EMPID,Presentdate)的赋予的日期和员工存在。
如何我一定日期范围内发现的缺席名单SQL查询来生成日期

我试过下面的SQL查询

SELECT empid FROM Master 
where empid NOT IN(select empid from Transaction 
where Date(Presentdate) between '2012-11-21' and '2012-12-22') 

仅返回雇员ID的谁缺席了,我想显示员工的缺席也日期

注(事务表存储只有员工的当前日期)

如果员工不存在,则整个记录不会插入事务表

+2

你怎么能做到这一点?你应该没有约会的权利?你有任何商业规则吗? – Mari

+0

我想你有两个选择。 1)编写一些存储过程2)您需要从上面的查询中获得结果并在PHP中进行一些编码。 –

+0

@Mari我不知道,但我认为我们可以采取缺席的日期指定日期的范围吗?例如,如果日期范围为5。在这3个日期出现在事务表,然后剩下的2个日期我们考虑缺席日期? –

回答

0

这应该工作,未经测试

SELECT m.empid  AS `Empid` 
    , d.dt  AS `AbsentDate` 
    FROM (SELECT DATE(t.Presentdate) AS dt 
      FROM transaction t 
      WHERE t.Presentdate >= '2012-11-21' 
      AND t.Presentdate < DATE_ADD('2012-12-22' ,INTERVAL 1 DAY) 
      GROUP BY DATE(t.Presentdate) 
      ORDER BY DATE(t.Presentdate) 
     ) d 
CROSS 
    JOIN master m 
    LEFT 
    JOIN transaction p 
    ON p.Presentdate >= d.dt 
    AND p.Presentdate < d.dt + INTERVAL 1 DAY 
    AND p.empid = m.empid 
WHERE p.empid IS NULL 
ORDER 
    BY m.empid 
    , d.dt 
+0

查询中的'd'是什么? –

+0

内嵌视图别名为'd'获取我们正在检查的一组“日期”值。使用事务表作为这些“日期”值的来源是实现此目的的一种便捷方式。基本上,我们之后是作为参数传入的两个值之间的一组不同的DATE值。 – Rahul

+0

此解决方案可能有问题。如果你有一天所有员工都不在场(这可能会在公众假期发生)。我会创建一个单独的表[日期]与每个日期的记录独立存储在表中的数据。 – Bulat

0

没有测试,但是这可能工作:

SELECT m.empid,d.Presentdate 

FROM Master as m, 
(select distinct Presentdate from transaction 
where Date(Presentdate) between '2012-11-21' and '2012-12-22') as d 

where m.empid not in (select empid from Transaction 
where Presentdate=d.Presentdate) 
0

//我想你的查询会喜欢这个获得员工姓名,身份证和他/她在场的日期。

select empid,empname,date from Transaction LEFT JOIN Master ON empid 
where Date(Presentdate) between '2012-11-21' and '2012-12-22' 

//用于循环目的创建的阵列。您将有emp ID和名称也

$array = array('2012-01-01','2012-01-02','2012-01-03','2012-01-05'); 
$date = new DateTime('2012-01-01'); // take first as start date 
$startDate = $array[0]; 
$endDate = $array[count($array)-1]; 
$loop = 'yes'; 

while($loop == 'yes') { 
    $date->add(new DateInterval('P1D')); //add one day to start date 
    if(!in_array($date->format('Y-m-d'),$array)) 
     $absentDate = $date->format('Y-m-d'); 
    if($date->format('Y-m-d') == $endDate) 
     $loop = 'no'; 
} 
print_r($absentDate);