基于时序下的进出记录匹配和数据去重

时序下进出记录匹配说明

需求说明

一个人至少管理1个工地;每天至少要去一个自己管理的工地;该人员没有固定上下班时间;统计一个人的月度工地出勤绩效情况。   

绩效考核标准:

       (1)每天工地工作时长不小于m小时,则达标;

       (2)每个月所有工地工作时长总和不小于n天,则达标;

       (3)每月该人管理的所有工地都有出勤记录的才达标,有工地未出勤的绩效不达标;

       (4)只有满足上述条件的绩效才达标;否则,不达标。

其中,夜班加班的分割处理,分割部分计入当天统计。

现只能通过提供的进出记录,判断月度出勤绩效情况。

问题描述

硬件上报读卡进出记录的问题说明:

       c-1.进或者出记录的时间时长问题:若人员经电感线圈激活卡片,但在该激活区域停留了一段时间,这种情况下的时间是哪一个?

       c-2.硬件设备如何保证按照时间顺序进出记录完整匹配的情况?

       c-3.假如无法保证时序下数据的完整性,是否可以降低不完整的情况,少量数据异常标识处理?

           时序下的进出记录队列可能情况很多,这里罗列部分:

              偶数队列长度情况,

              (1)进出进出进出

              (2)出进出进出进

              (3)出出进出进进

              (4)进进出出进出

              奇数队列长度情况,

              (1)进出进出进出进

              (2)出进出进出进出

              (3)出出进进出进进

              (4)进进出出进出出

  这样的组合太多,不再一一罗列,如果上述无法保证时序下数据完整匹配的情况,则考核的报表无法保证真实可靠性。

问题分析

要解决上述需求,必须要匹配下列要素。

(1)    月度时序;

(2)    日期匹配;

(3)    项目地人员、日期匹配;

(4)    项目地进出记录匹配;

月度时序问题

假如,某人某天未去他管理的项目地,则无进出记录,在sql 后,查询不到该天日期,会造成该月日期中断。

怎么解决因查询无进出记录造成的月日期时序中断的情况?

a.   存储过程调用

这里不再赘述。

b.   sql变量控制

指定数据条数,生成连续的数字或日期。

涉及到的知识点是变量,DATE_SUB(),DATE_FORMAT().使用以上方法的好处就是不用创建存储过程,也不涉及到任何表。缺点就是数据的条数控制并不灵活,不能和用户之间形成互动,即不能自定义日期区间,只能控制数据条数。

c.  利用现有含日期时间的表

要求是这个表中的数据足够庞大,好处是不涉及存储过程,不涉及变量,且能自定义日期区间。

综合考虑,使用存储过程调用。

mysql 存储过程调用

可以理解为建立标准日期时间表。

step1.创建存储过程

CREATE PROCEDURE createDate()

BEGIN

       DECLAREindexdate DATE;

       setindexdate = DATE('2019-01-01');

WHILE indexdate<=DATE('2020-01-01')

  DO

                     INSERTinto  ts_date(date) VALUES(indexdate);

                     setindexdate = ADDDATE(indexdate,1);

end WHILE;

END;

Step2.存储过程调用

CALL createDate();

日期匹配问题

这里可以这么处理

(1)   根据月度时序中的表来补全日期,

(2)   再根据日期来查询进出记录,

(3)   根据卡号过滤人员,

(4)   根据记录中的处理机设备编号来区分项目地。

这里就不存在问题了。

项目地匹配问题

设备和项目地绑定,这里可以这样处理

(1)    根据处理机设备来区分项目地

(2)    根据记录中上报的卡号识别人员信息

这里也不存在问题。

项目地进出记录匹配问题

上报数据中有时间、人员卡号、处理机编号、进出状态标识,满足匹配条件。

但是,因为意外造成的进出记录不匹配,会对报表统计造成致命错误。

因此这里重点说明下因为异常造成的数据匹配问题。

匹配模式

正常的匹配模式有下列几种:

1.    ABAB

2.    BABA

3.    ABABA

4.    BABAB

5.    A

6.    B

其它的均为异常情况;

基于此,提供基本匹配算法。

基本思路:

(1)   匹配要素为A(进)B(出)

(2)   根据需要匹配的数据长度构造上述6种匹配模式下的正确匹配数据组

(3)   筛选符合条件的数据,重组新的数据组并标识不匹配的数据到源数据组

构造匹配数据组方法如下:


构造匹配数据

构建满足匹配模式的数据并标识原始数据匹配情况的方法如下:


数据匹配及源数据标识

上述完成后,只需要解决数据的重发问题即可。

(1)    数据重发问题,需要根据实际设备验证。

(2)    跨多天工作的情况:实际情况下会很少发生,上述计算时长均分割到当天和前天,这样理论上会造成实际时长缺失。建议配合提供管理制度解决。

最终标记

数据去重

因为是根据时间去重的,记录有进出之分,且进出需要考核时长,因此需要根据客户要求灵活控制去重时间和保留进出记录的哪一种。

去重
验证


true


false

你可能感兴趣的:(基于时序下的进出记录匹配和数据去重)