要求写一个算法
根据员工的打卡记录判断他是上早班中班还是晚班
早班8点-4点中班4点到12点晚班12点到8点
上班前和下班后打卡!
上下班都打卡为出勤
上下班都未打卡为缺勤
上下班只打了一次为考勤异常,暂时不用计算!
以一个月为单位
根据这些数据得到某人在该月内出勤多少天,该天为什么班,
这些数据一表格样式显示出来!     人--日期--是否出勤--班次数据库用的是SQL,主要问题在于员工打卡的不规范,
现在规定上班前一小时内,下班后一小时为合法打卡!
时间问题也想过,但是不知道如何写法,要判断日期和时间!
初学DELPHI,求大家帮忙····
分数问题结贴之后开新贴补够分数
谢谢了!!!

解决方案 »

  1.   

    初期分析
    出勤类型  应打卡时间
    早班前    7-8
    晚班后    8-9
    中班前    15-16
    早班后    16-17
    晚班前    23-0
    中班后    0-1由此根据员工实际打卡时间不难判断出勤状态
    具体算法
    //根据员工时间打卡时间计算其打卡类型是在上班前还是下班后
    if 实际打卡时间 in (7-8;15-16;23-0) then 打卡类型=上班前
    if 实际打卡时间 in(8-9;16-17;0-1) then 打卡类型=下班后//以下对在下班后应打卡时间段内打卡的,在数据中搜寻该员工上一次打卡时间,根据本次打卡时间和上次打卡时间之差计算其是否正常出勤
    if 打卡类型=下班后 then
    begin
        if  8=<Hoursbetween(打卡时间,上次打卡时间)<=10 then
            出勤状态:=正常
        else
            出勤状态:=异常
    end;
      

  2.   

    我写过一个这样的东西基本流程如下:
    1。导入考勤资料
    2。分析考勤资料,一天一天分析
    for first day to last day 
    do
         find(当天刷卡信息)
         if (早上第一次刷卡,一小时内) then 正常 InsertToUseList else InsertToUnUseList
         if(晚上最后一次刷卡,一小时内) then 正常InsertToUseList else InsertToUnUseList
    3.分析出勤情款
    for first day to last day in UseList
    do
         find(改人当天班别)
         if (刷卡时间)〉=班别要求时间 then 正常 Asure(判定,上班正常)
             else
             {
                    if (对应请假单,未刷卡单等等)+ (刷卡时间)<班别要求时间
                              then Asure(旷工,请假,未刷卡的时间数)
              }
    大概这样,其中有迟到,早退等等的判定规则设定等等。
    主要思想是:把数据分割成一天,的最小单位做处理。这样看上去就简单多了。
      
      

  3.   

    说一下我的一点思路,不对的地方请指教前提是数据库中保存了每个工人每天的打卡记录班次    上班打卡时间区间     下班打卡时间区间
    早班    [昨天23::00-0:00]    [8:00-9:00] 
    中班    [8:00-9:00]          [16:00-17:00] 
    晚班    [16:00-17:00]        [次日0:00-次日1:00] 
    首先分四种情况(这里的正常与否是指是否在打卡时间范围内)
    1. 正常出勤 上班时间正常,下班时间正常
    2. 早退     上班时间正常,下班时间不正常
    3. 迟到     上班时间不正常,下班时间正常
    4. 旷工     无时间记录或上下班时间不正常区间A:某天的时间区间,对于某一天来说,计算时间前延一个小时,
           后推一个小时比如 2月1日 对应时间区间 (1月31日23:00-2月2日1:00)
    区间B:上班打卡时间范围的合集,包括早,中,晚班的上班打卡时间范围
    区间C:下班打卡时间范围的合集,包括早,中,晚班的下班打卡时间范围这里我只给出一天的处理流程:
    1. 对于某一天,取得区间A
    2. 查找某人在区间A里的打卡时间记录,排序。有记录转第3步,否则旷工
    3. 以查到记录的第一条为该天上班打卡时间,并以此时间确定此人的所属
    班次,确定其下班时间范围(区间C中的一个),并判断此时间是否位于区
    间B内,是转第三步,否转第四步
    4. 上班正常标记
    5. 上班不正常标记
    6. 以查到记录的最后一条为该天下班打卡时间,判断是否位于区间C内,
    是转第7步,否转第8步
    7. 下班正常标记
    8. 上班不正常标记
    9. 根据该人的上下班标记判定班次,如果属于正常出勤,计算上班时间。
    10.处理结果存入表
    11.该月全部处理完后做汇总,对于特殊情况(比如问题2)做些修正,出报表
    现在这里面有两个问题:
    1. 对于某人某天只打了一次卡时,如何确定其所属班次。比如只在[8:00-9:00] 
    打了一次卡,如何确定是早班还是中班
    2. 对于连续值班并且跨天的情况,比如从2月1日16:00连续上班到2月2日8:00,
    这个问题和1有关联