0

すべての従業員で構成される 2 つのテーブル Master(empname,empid) と、日付とどの従業員が存在したかを示す別のテーブル Transaction(empid,Presentdate) があります。
特定の日付範囲内の欠席者のリストを見つけるにはどうすればよいですか

以下の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のみを返す、従業員の欠勤日も表示したい

注(トランザクション テーブルには、従業員の現在の日付のみが格納されます)

従業員が不在の場合、レコード全体がトランザクション テーブルに挿入されません。

4

3 に答える 3

0

// あなたのクエリは、従業員の名前、ID、および従業員がいる日を取得するためにこれを好むと思います。

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

// ループ目的で配列を作成。あなたはemp idとnameも持っています

$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);
于 2012-12-26T10:06:18.193 に答える
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
于 2012-12-26T09:51:10.900 に答える
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)
于 2012-12-26T09:36:42.133 に答える