表manualsign,里面有
SignId  签卡Id 
UserId   用户id 
SignTime  签卡时间
SignDesc  签卡备注
SignTag  签卡标记

现在我要根据输入的时间段在界面上显示出勤率,迟到次数,早退次数,矿工次数
要求出勤率精确到百分数两位小数,开始时间和结束时间之内只要是非周六和周日都算工作日。
工作时间以上午8:30和下午5:30为准。
这要怎么查呢?要写几个方法吗?

解决方案 »

  1.   

    出勤率: 无论早退或迟到, 都是出勤.
      1. 获取出勤天数: SELECT count(*) from manualsign where signtime between a and b
      2. 程序中根据时间段计算工作日.
    迟到次数:
      1. 查询得到签卡是本天的第多少分钟(如果要精确到秒继续计算), SELECT HOUR(SignTime) * 60 + MINUTE(SignTime) AS minutes FROM manualsign.
      2. 把你的8.30和5.30的相对值在程序中计算出来, 比较就可以了
    早退次数: 和迟到的思想一样.
    矿工次数: 出勤率的第一步. 反演一下...上面草草的做了一下, 但是, 如果加入周末打卡, 可能就会比较复杂了....
    另外, 员工一天打N次卡, 记录几次??
      

  2.   


    where weekday(SignTime) in(0, 1, 2, 3, 4)你具体查查, 我不知道weekday返回的具体几代表星期几..
      

  3.   

    1.某个时间段有多少工作日通过程序算出来
    2.sql语句--假如该段有22个工作ri
    select a.userid,a.checkrate,b.late,c.leave,d.absent from 
    (select userid,count(*)/22 checkdate from manualsign group by userid)a,
    (select userid,count(*) late from manualsign where 签到时间<8:30 group by userid )b,
    (select userid,count(*) leave from manualsign where 签退时间>8:30 group by userid )c,
    (select userid,22-count(*) absentfrom manualsign group by userid )d,
    where a.userid=b.userid,b.userid=c.userid,c.userid=d.userid,d.userid=a.userid