select * from kq_data where tcode='170500064' and  tdatetime between '2018-08-01 00:00' and '2018-08-31 23:59' order by tdatetime就行这样的,上班时间08:00到11:50   13:30到17:20   17:20以后算加班  中间没考勤的话算请假!怎么写@

解决方案 »

  1.   

    个人习惯,看情况复杂不复杂了,如果情况比较复杂,最好结合程序来判断,单纯用SQL语句,很难得到准确的结果。
    就像是:中间没考勤的话算请假——有没有可能是出差,出差有可能不打卡的;也可能是调班;……
      

  2.   

    这个很复杂,我刚好写过。
    第一步 ,定义打卡钟正负几分钟算是打卡成功,比如 早上8点, 如果是凌晨1点打卡是不是属于正常范围?所以一般是定义正负5分钟。
    第二步,定义上午上班2次打卡8:00和11:50,下午上班2次打卡 13:30和17:20,加班类似先不讨论。
    第三步,产生上午和下午4次临时表,根据第一步的偏移值过滤,举例(符合过滤要求,上班只取第一次,下班取最后1次):
                 2018年10月1日  打卡7点56分  ,  属于上午上班  1次
                 2018年10月1日  打卡7点57分  ,  属于上午上班  2次,无效丢弃
                 2018年10月1日  打卡11点52分  , 属于上午下班  1次
    第四步,根据工作日历表,left join 第三步的临时表,产生如下考勤记录表结果(NULL值设置为空白 isnull(卡钟,'')),
                 日期                       上午上班   上午下班    下午上班  下午下班   晚上上班  晚上下班
                 2018年10月1日      7点56分     11点52分  13点28分  17点22分 
    后续: 根据任一上下班时间取考勤异常(where 上午上班 =‘’or 上午下班 =‘’or 下午上班 =‘’下午下班 =‘’)