根据上下班的打卡记录计算工时regular,update + case..when + if,进行多种打卡情况的计算。

根据上下班的打卡记录计算工时regular,update + case..when + if,进行多种打卡情况的计算。

UPDATE tmp2
SET tmp2.regular = CASE
    # 只有一次打卡记录
    WHEN clock_in = clock_out  THEN '0'
    # 迟到+早退
    WHEN classes = '白班' AND CONCAT(time_one," ",clock_in) >= DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out < offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),CONCAT(time_one," ",offwork_one))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) + '0.5') 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),CONCAT(time_one," ",offwork_one))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),CONCAT(time_one," ",offwork_one))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),CONCAT(time_one," ",offwork_one))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),CONCAT(time_one," ",offwork_one))/60) + '0.5') 
	- rest 
    # 迟到+正常下班
    WHEN classes = '白班' AND CONCAT(time_one," ",clock_in) >= DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out >= offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),CONCAT(time_one," ",offwork_one))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) + '0.5') 
	- rest 
    # 正常上班+早退
    WHEN classes = '白班' AND CONCAT(time_one," ",clock_in) < DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out < offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),CONCAT(time_one," ",offwork_one))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),CONCAT(time_one," ",offwork_one))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),CONCAT(time_one," ",offwork_one))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),CONCAT(time_one," ",offwork_one))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),CONCAT(time_one," ",offwork_one))/60) + '0.5') 
	- rest 
    # 正常上班+正常下班
    WHEN classes = '白班' AND CONCAT(time_one," ",clock_in) < DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out >= offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),CONCAT(time_one," ",offwork_one))/60,1) 
	- rest
    # 迟到(第一天)+早退(第一天)
    WHEN classes = '夜班' AND CONCAT(time_one," ",clock_in) >= DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out >= work_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) + '0.5') 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) + '0.5') 
	- rest 
    # 迟到(第一天)+早退(第二天)
    WHEN classes = '夜班' AND CONCAT(time_one," ",clock_in) >= DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out < offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) + '0.5') 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) + '0.5') 
	- rest 
    # 迟到(第二天)+早退(第二天)
    WHEN classes = '夜班' AND clock_in < offwork_one AND clock_out < offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), DATE_ADD(CONCAT(time_one," ",clock_in), INTERVAL 1 DAY))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), DATE_ADD(CONCAT(time_one," ",clock_in), INTERVAL 1 DAY))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), DATE_ADD(CONCAT(time_one," ",clock_in), INTERVAL 1 DAY))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), DATE_ADD(CONCAT(time_one," ",clock_in), INTERVAL 1 DAY))/60) + '0.5') 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) + '0.5') 
	- rest 
    # 正常上班+早退(第一天)
    WHEN classes = '夜班' AND CONCAT(time_one," ",clock_in) < DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out >= work_one
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",clock_out),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) + '0.5') 
	- rest 
    # 正常上班+早退(第二天)
    WHEN classes = '夜班' AND CONCAT(time_one," ",clock_in) < DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out < offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,DATE_ADD(CONCAT(time_one," ",clock_out), INTERVAL 1 DAY),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60) + '0.5') 
	- rest 
    # 迟到(第一天)+正常下班
    WHEN classes = '夜班' AND CONCAT(time_one," ",clock_in) >= DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out >= offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), CONCAT(time_one," ",clock_in))/60) + '0.5') 
	- rest 
    # 迟到(第二天)+正常下班
    WHEN classes = '夜班' AND clock_in < offwork_one AND clock_out >= offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) 
	- IF(TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), DATE_ADD(CONCAT(time_one," ",clock_in), INTERVAL 1 DAY))/60,1) - FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), DATE_ADD(CONCAT(time_one," ",clock_in), INTERVAL 1 DAY))/60) >= '0.5' , CEILING(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), DATE_ADD(CONCAT(time_one," ",clock_in), INTERVAL 1 DAY))/60) , FLOOR(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one), DATE_ADD(CONCAT(time_one," ",clock_in), INTERVAL 1 DAY))/60) + '0.5') 
	- rest 
    # 正常上班+正常下班
    WHEN classes = '夜班' AND CONCAT(time_one," ",clock_in) < DATE_ADD(CONCAT(time_one," ",work_one), INTERVAL 5 MINUTE) AND clock_out >= offwork_one 
	THEN TRUNCATE(TIMESTAMPDIFF(MINUTE,CONCAT(time_one," ",work_one),DATE_ADD(CONCAT(time_one," ",offwork_one), INTERVAL 1 DAY))/60,1) 
	- rest
  END;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值