$sql="SELECT _staffinfo.id,cardlogtime.logtime FROM _staffinfo , cardlogtime where _staffinfo.staffid='".$sessionstaffid."' and cardlogtime.userid='".$sessionstaffid."' and _staffinfo.state!=1  and cardlogtime.logtime like '%".$txtyear."-".$txtmonth."-%'";
      //联表查询,条件是工卡号,这里查出这个人的工号和打卡时间
                          
  $rs=mysql_query($sql);
    
  while($row=mysql_fetch_array($rs)){
 
 $logtime=explode(" ",$row['logtime']);
                 //拆分时间  $logtime[0]是日期 $logtime[1]是时间
         
 $sid=$row['id'];
 
 $sql1="select * from _classassign where state!=1 and sid=".$sid;//查詢班次id,條件是工卡號
   $rs1=mysql_query($sql1);
          while($row1=mysql_fetch_array($rs1))
  {
                                                   //月             年
      $search="select * from attandance_".$txtmonth."_".$txtyear." where sid=".$row['id']." and DATE='".$logtime[0]."'";//查要插入的表,条件是id和日期
  $rssearch=mysql_query($search);                  $num=mysql_num_rows($rssearch);
   
   
   $sql2="select * from _workhourclass where state!=1 and id=".$row1['cid'];//根據班次id查出班次的排班時間
   $rs2=mysql_query($sql2);          
   $row2=mysql_fetch_array($rs2);        
   $sqljiaban="select * from _departmentovertimeinfo where state!=1 and sid=".$row['id'];
   $rsjiaban=mysql_query($sqljiaban);//根據sid查出此sid申請加班的時間
   $rowjia=mysql_fetch_array($rsjiaban); 
  
       //注意这里,这样判断跨天时间有问题,但是班次又有多个,又不知拿哪个班次时间去比较    if($num==0){  //如果查出符合条件的记录为空就添加到表                 if($logtime[1]>="00:00"&&$logtime[1]<"06:05")//判斷第一个時間是不是跨天的
  {
    $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','".$logtime[1]."','0','0','0','0','0','0')";

  }   //判斷時間是不是屬于班次的第一個上班時間
   else if($logtime[1]>=datetime($row2['wkphase1intime'])&&$logtime[1]<datetime3($row2['wkphase1outtime']))
   {                    
    $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','".$logtime[1]."','0','0','0','0','0')";  
      
  
       }      
    //判斷時間是不是屬于班次的第二個下班時間
   else if($logtime[1]>=datetime3($row2['wkphase1outtime'])&&$logtime[1]<datetime($row2['wkphase2intime']))
   {
     
    $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','0','".$logtime[1]."','0','0','0','0')";
      
      
  //判斷時間是不是屬于班次的第三個上班時間
   }else if($logtime[1]>=datetime($row2['wkphase2intime'])&&$logtime[1]<datetime3($row2['wkphase2outtime']))
   {
    $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','0','0','".$logtime[1]."','0','0','0')";
          
   //判斷時間是不是屬于班次的第四個下班時間
   }else if($logtime[1]>=datetime3($row2['wkphase2outtime'])&&$logtime[1]<datetime4($row2['wkphase2outtime']))
   {                                                                        
    $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','0','0','0','".$logtime[1]."','0','0')";
                                                                
      //判斷時間是不是屬于班次的第五個上班時間
   }else if($logtime[1]>=datetime($rowjia['starttime'])&&$logtime[1]<datetime2($rowjia['starttime']))
   {           
        if($rowjia['starttime']=="")//如果加班的上班时间为空,插入0
 {
 $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','0','0','0','0','0','0')";   
   
  }else
{
      $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','0','0','0','0','".$logtime[1]."','0')";


}         
   
      
  //判斷時間是不是屬于班次的第六個下班時間, 这个时间就是凌晨00:00以前到加班的上班时间之间
   }else if($logtime[1]<="23:59"&&$logtime[1]>=datetime2($rowjia['starttime']))
   {
     if($rowjia['endtime']=="")//如果加班的下班时间为空,插入0  {
 $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','0','0','0','0','0','0')";
          }else
 {
  
    $insert="insert into attandance_".$txtmonth."_".$txtyear."(sid,cid,DATE,weekday,cardtime1,cardtime2,cardtime3,cardtime4,cardtime5,cardtime6) values(".$row['id'].",".$row2['id'].",'".$logtime[0]."','".weekday($logtime[0])."','0','0','0','0','0','".$logtime[1]."')";
     
 }
                   
   }                  
                
   mysql_query($insert);
   
}

解决方案 »

  1.   

    代码接上,否则更新                        else   //更新
    {
     if($logtime[1]>="00:00"&&$logtime[1]<"06:05")//如果时间是跨天的时间
       {
          $time=explode("-",$logtime[0]);//拆分日期
      
        $row4=mysql_fetch_array(mysql_query($search));
     if($row4['cardtime4']=="00:00:00"&&$row4['cardtime5']=="00:00:00"&&$row4['cardtime6']=="00:00:00")//如果时间为四个,跨时就会空三个,补到最后下班时间四
     {
           $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime4='$logtime[1]' where sid=".$row['id']." and  DATE='".$time[0]."-".$time[1]."-0".($time[2]-1)."'";  //把跨天的时间更新到上一天的cardtime4里
      
     }else if($row4['cardtime2']=="00:00:00"&&$row4['cardtime3']=="00:00:00"&&$row4['cardtime4']=="00:00:00"&&$row4['cardtime5']=="00:00:00"&&$row4['cardtime6']=="00:00:00")
     {
        //如果時間為二個,跨時的是第二個,就會空五個,把跨天的時間補到第二個時間裏
    $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime2='$logtime[1]' where sid=".$row['id']." and  DATE='".$time[0]."-".$time[1]."-0".($time[2]-1)."'";//把跨天的时间更新到上一天的cardtime2里

     }
     else if($row4['cardtime5']!="00:00:00")//如果第五个时间不为空,把跨天的时间补到上一天的第6个时间里
     {
         
          $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime6='$logtime[1]' where sid=".$row['id']." and  DATE='".$time[0]."-".$time[1]."-0".($time[2]-1)."'";  //把跨天的时间更新到上一天的fingertime6里
     }
      
    ////////////////////////////////////////////////////////////////
     
      $update2="update attandance_".$txtmonth."_".$txtyear." set cardtime='0' where sid=".$row['id']." and  DATE='".$logtime[0]."'";//把跨天的时间更新到上一天的cardtime6里,再把跨天时间cardtime1更新为0
      mysql_query($update2); 
      }
           //更新時間1
    else if($logtime[1]>=datetime($row2['wkphase1intime'])&&$logtime[1]<datetime3($row2['wkphase1outtime']))
       {     
           $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime1='".$logtime[1]."',cid=".$row2['id']." where sid=".$sid." and  DATE='".$logtime[0]."'";
       
       
       }                   //更新時間2
       else if($logtime[1]>=datetime3($row2['wkphase1outtime'])&&$logtime[1]<datetime($row2['wkphase2intime']))
       {
      $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime2='".$logtime[1]."',cid=".$row2['id']." where sid=".$sid." and  DATE='".$logtime[0]."'";
          
       //更新時間3
       }else if($logtime[1]>=datetime($row2['wkphase2intime'])&&$logtime[1]<datetime3($row2['wkphase2outtime']))
       {
         
       $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime3='".$logtime[1]."',cid=".$row2['id']." where sid=".$sid." and  DATE='".$logtime[0]."'"; 
      
       //更新時間4    
       }else if($logtime[1]>=datetime3($row2['wkphase2outtime'])&&$logtime[1]<datetime4($row2['wkphase2outtime']))
       {
              $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime4='".$logtime[1]."',cid=".$row2['id']." where sid=".$sid." and  DATE='".$logtime[0]."'";  
       
           //更新時間5 
       }else if($logtime[1]>=datetime($rowjia['starttime'])&&$logtime[1]<datetime2($rowjia['starttime']))
       {
           if($rowjia['starttime']=="")
       {
       $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime5='0',cid=".$row2['id']." where sid=".$sid." and  DATE='".$logtime[0]."'";
       }else{
              $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime5='".$logtime[1]."',cid=".$row2['id']." where sid=".$sid." and  DATE='".$logtime[0]."'";
        }
      
          //更新時間6   这个时间就是凌晨00:00以前到加班的上班时间之间
       }else if($logtime[1]<="23:59"&&$logtime[1]>=datetime2($rowjia['starttime']))
       {
        if($rowjia['endtime']=="")
    {
       $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime6='0',cid=".$row2['id']." where sid=".$sid." and  DATE='".$logtime[0]."'"; 
    }else{
              $update1="update attandance_".$txtmonth."_".$txtyear." set cardtime6='".$logtime[1]."',cid=".$row2['id']." where sid=".$sid." and  DATE='".$logtime[0]."'"; 
     }    
       } 
        mysql_query($update1);
     }


                       }

    }
     echo $txtyear."年".$txtmonth."刷卡时间己导入";
    代码如上,大家不必看得太认真,指出逻辑上哪有错就行了!
      

  2.   

    因为现在考勤要做成网页形式的,数据库还是通过写的程序从access导入mysql里的,只有工号和打卡时间,所有的上下班打卡时间都是在同一个字段里,就是不好拆开上下班时间呀,不然也省了很多事!现在就是把当天的打卡时间按[上班][下班]时间分别存入不同的字段,如果为空就插0,因大部分人当月班次较多,上班和下班打卡时间也不统一,又有跨天的情况,只能把他的班次时间拿出比较判断,属于这个时间段就插进去,可是由于班次较多,循环的时候时间就会乱了,所以才请大家想想有什么好办法,代码越少越好!
      

  3.   

    用RFID卡做考勤吧...
    要准确知道上下班是需要两个读卡器的
    进门代表上班,出门代表下班如果只有一个读卡器只能用在简单情况(只能有一次上下班)
    现在的控制器一般都支持两个读卡器
    加多一个读卡器也不需多少钱