时序下进出记录匹配说明
需求说明
一个人至少管理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) 跨多天工作的情况:实际情况下会很少发生,上述计算时长均分割到当天和前天,这样理论上会造成实际时长缺失。建议配合提供管理制度解决。
最终标记
网友评论