当月考勤统计

记录一下考勤导出,需要的朋友可以借鉴,很多地方还不是很完善.
以下为导出的结果(都是假数据),后面很长没有截全
在这里插入图片描述
sql 表结构就不放了,可以做个参考

SELECT
    substr(date,1,7) date,`wname`,`name`,Code,iDCardNumber,teamSysNo,teamName,
    count(
    case
    when status = '正常' then date  end
    )  normal,
    count(
    case
    when status <> '正常'then date end
    )  notNormal,
    day(LAST_DAY(now()))- count(status
    )  notCord,
    count(
    case
    when startTime = endTime and startTime  < '12:00:00' or startTime = '12:00:00' then date end
    )  upDutyCord,
    count(
    case
    when startTime = endTime and endTime > '12:00:00' or endTime = '12:00:00' then date end
    )  downDutyCord,
    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '01' THEN starttime END ),11,6) AS 'upDuty_1',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '01' THEN endtime END ),11,6) AS 'downDuty_1',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '01' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_1',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '02' THEN starttime END ),11,6) AS 'upDuty_2',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '02' THEN endtime END ),11,6) AS 'downDuty_2',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '02' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_2',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '03' THEN starttime END ),11,6) AS 'upDuty_3',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '03' THEN endtime END),11,6) AS 'downDuty_3',
    ROUND(Sum( CASE WHEN Substring( starttime, 9, 2 ) = '03' THEN ( TIMESTAMPDIFF( MINUTE, starttime, endtime ) ) / 60 END ),1) AS 'time_3',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '04' THEN starttime END ),11,6) AS 'upDuty_4',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '04' THEN endtime END ),11,6) AS 'downDuty_4',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '04' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_4',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '05' THEN starttime END ),11,6) AS 'upDuty_5',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '05' THEN endtime END ),11,6) AS 'downDuty_5',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '05' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_5',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '06' THEN starttime END ),11,6) AS 'upDuty_6',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '06' THEN endtime END),11,6) AS 'downDuty_6',
    ROUND(Sum( CASE WHEN Substring( starttime, 9, 2 ) = '06' THEN ( TIMESTAMPDIFF( MINUTE, starttime, endtime ) ) / 60 END ),1) AS 'time_6' ,

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '07' THEN starttime END ),11,6) AS 'upDuty_7',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '07' THEN endtime END ),11,6) AS 'downDuty_7',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '07' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_7',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '08' THEN starttime END ),11,6) AS 'upDuty_8',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '08' THEN endtime END ),11,6) AS 'downDuty_8',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '08' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_8',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '09' THEN starttime END ),11,6) AS 'upDuty_9',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '09' THEN endtime END),11,6) AS 'downDuty_9',
    ROUND(Sum( CASE WHEN Substring( starttime, 9, 2 ) = '09' THEN ( TIMESTAMPDIFF( MINUTE, starttime, endtime ) ) / 60 END ),1) AS 'time_9',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '10' THEN starttime END ),11,6) AS 'upDuty_10',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '10' THEN endtime END ),11,6) AS 'downDuty_10',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '10' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_10',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '11' THEN starttime END ),11,6) AS 'upDuty_11',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '11' THEN endtime END ),11,6) AS 'downDuty_11',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '11' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_11',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '12' THEN starttime END ),11,6) AS 'upDuty_12',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '12' THEN endtime END),11,6) AS 'downDuty_12',
    ROUND(Sum( CASE WHEN Substring( starttime, 9, 2 ) = '12' THEN ( TIMESTAMPDIFF( MINUTE, starttime, endtime ) ) / 60 END ),1) AS 'time_12' ,

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '13' THEN starttime END ),11,6) AS 'upDuty_13',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '13' THEN endtime END ),11,6) AS 'downDuty_13',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '13' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_13',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '14' THEN starttime END ),11,6) AS 'upDuty_14',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '14' THEN endtime END ),11,6) AS 'downDuty_14',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '14' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_14',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '15' THEN starttime END ),11,6) AS 'upDuty_15',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '15' THEN endtime END),11,6) AS 'downDuty_15',
    ROUND(Sum( CASE WHEN Substring( starttime, 9, 2 ) = '15' THEN ( TIMESTAMPDIFF( MINUTE, starttime, endtime ) ) / 60 END ),1) AS 'time_15',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '16' THEN starttime END ),11,6) AS 'upDuty_16',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '16' THEN endtime END ),11,6) AS 'downDuty_16',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '16' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_16',
    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '17' THEN starttime END ),11,6) AS 'upDuty_17',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '17' THEN endtime END ),11,6) AS 'downDuty_17',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '17' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_17',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '18' THEN starttime END ),11,6) AS 'upDuty_18',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '18' THEN endtime END ),11,6) AS 'downDuty_18',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '18' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_18',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '19' THEN starttime END ),11,6) AS 'upDuty_19',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '19' THEN endtime END ),11,6) AS 'downDuty_19',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '19' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_19',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '20' THEN starttime END ),11,6) AS 'upDuty_20',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '20' THEN endtime END ),11,6) AS 'downDuty_20',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '20' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_20',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '21' THEN starttime END ),11,6) AS 'upDuty_21',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '21' THEN endtime END ),11,6) AS 'downDuty_21',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '21' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_21',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '22' THEN starttime END ),11,6) AS 'upDuty_22',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '22' THEN endtime END ),11,6) AS 'downDuty_22',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '22' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_22',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '23' THEN starttime END ),11,6) AS 'upDuty_23',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '23' THEN endtime END ),11,6) AS 'downDuty_23',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '23' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_23',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '24' THEN starttime END ),11,6) AS 'upDuty_24',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '24' THEN endtime END ),11,6) AS 'downDuty_24',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '24' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_24',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '25' THEN starttime END ),11,6) AS 'upDuty_25',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '25' THEN endtime END ),11,6) AS 'downDuty_25',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '25' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_25',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '26' THEN starttime END ),11,6) AS 'upDuty_26',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '26' THEN endtime END ),11,6) AS 'downDuty_26',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '26' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_26',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '27' THEN starttime END ),11,6) AS 'upDuty_27',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '27' THEN endtime END ),11,6) AS 'downDuty_27',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '27' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_27',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '28' THEN starttime END ),11,6) AS 'upDuty_28',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '28' THEN endtime END ),11,6) AS 'downDuty_28',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '28' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_28',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '29' THEN starttime END ),11,6) AS 'upDuty_29',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '29' THEN endtime END ),11,6) AS 'downDuty_29',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '29' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_29',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '30' THEN starttime END ),11,6) AS 'upDuty_30',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '30' THEN endtime END ),11,6) AS 'downDuty_30',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '30' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_30',

    substr(Min( CASE WHEN Substring( starttime, 9, 2 ) = '31' THEN starttime END ),11,6) AS 'upDuty_31',
    substr(Max( CASE WHEN Substring( starttime, 9, 2 ) = '31' THEN endtime END ),11,6) AS 'downDuty_31',
    ROUND(Sum(CASE WHEN Substring( starttime, 9, 2 ) = '31' THEN (ceil(TIMESTAMPDIFF( MINUTE, starttime, endtime ))) / 60 END ),1) AS 'time_31'
    FROM
        (select
        w.wName,
        p.NAME,
        a.code,
        a.IDCardNumber iDCardNumber,
        a.TeamSysNo teamSysNo,
        a.TeamName teamName,
        SUBSTR( a.Date, 1, 10 ) AS date,
        min(a.date) AS startTime,
        max(a.date) AS endTime,
        CASE
        WHEN min(
        DATE_FORMAT( a.date, '%H:%i' )) = max(
        DATE_FORMAT( a.date, '%H:%i' )) THEN
        '上班或下班未打卡'
        WHEN min(
        DATE_FORMAT( a.date, '%H:%i:%S' )) > '8:00' THEN
        '迟到'
        WHEN max(
        DATE_FORMAT( a.date, '%H:%i:%S' )) < '17:30' THEN
        '早退' ELSE '正常'
        END AS STATUS
        FROM
        attendance a
        JOIN winfo w ON a.IDCardNumber = w.IDCardNumber
        JOIN pinfo p ON a.`code` = p.`Code`
        WHERE
        MONTH ( a.date ) =  month(LAST_DAY(now())) and a.isdel = 0
        GROUP BY
        a.IDCardNumber,
        DAY ( a.date )
        ORDER BY a.IDCardNumber)att
    GROUP BY iDCardNumber;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值