時序下進(jìn)出記錄匹配說明
需求說明
一個人至少管理1個工地;每天至少要去一個自己管理的工地;該人員沒有固定上下班時間;統(tǒng)計一個人的月度工地出勤績效情況。???
績效考核標(biāo)準(zhǔn):
?????? (1)每天工地工作時長不小于m小時,則達(dá)標(biāo);
?????? (2)每個月所有工地工作時長總和不小于n天,則達(dá)標(biāo);
?????? (3)每月該人管理的所有工地都有出勤記錄的才達(dá)標(biāo),有工地未出勤的績效不達(dá)標(biāo);
?????? (4)只有滿足上述條件的績效才達(dá)標(biāo);否則,不達(dá)標(biāo)。
其中,夜班加班的分割處理,分割部分計入當(dāng)天統(tǒng)計。
現(xiàn)只能通過提供的進(jìn)出記錄,判斷月度出勤績效情況。
問題描述
硬件上報讀卡進(jìn)出記錄的問題說明:
?????? c-1.進(jìn)或者出記錄的時間時長問題:若人員經(jīng)電感線圈激活卡片,但在該激活區(qū)域停留了一段時間,這種情況下的時間是哪一個?
?????? c-2.硬件設(shè)備如何保證按照時間順序進(jìn)出記錄完整匹配的情況?
?????? c-3.假如無法保證時序下數(shù)據(jù)的完整性,是否可以降低不完整的情況,少量數(shù)據(jù)異常標(biāo)識處理?
?????? ??? 時序下的進(jìn)出記錄隊列可能情況很多,這里羅列部分:
????????????? 偶數(shù)隊列長度情況,
????????????? (1)進(jìn)出進(jìn)出進(jìn)出
????????????? (2)出進(jìn)出進(jìn)出進(jìn)
????????????? (3)出出進(jìn)出進(jìn)進(jìn)
????????????? (4)進(jìn)進(jìn)出出進(jìn)出
????????????? 奇數(shù)隊列長度情況,
????????????? (1)進(jìn)出進(jìn)出進(jìn)出進(jìn)
????????????? (2)出進(jìn)出進(jìn)出進(jìn)出
????????????? (3)出出進(jìn)進(jìn)出進(jìn)進(jìn)
????????????? (4)進(jìn)進(jìn)出出進(jìn)出出
? 這樣的組合太多,不再一一羅列,如果上述無法保證時序下數(shù)據(jù)完整匹配的情況,則考核的報表無法保證真實可靠性。
問題分析
要解決上述需求,必須要匹配下列要素。
(1)? ? 月度時序;
(2)? ? 日期匹配;
(3)? ? 項目地人員、日期匹配;
(4)? ? 項目地進(jìn)出記錄匹配;
月度時序問題
假如,某人某天未去他管理的項目地,則無進(jìn)出記錄,在sql 后,查詢不到該天日期,會造成該月日期中斷。
怎么解決因查詢無進(jìn)出記錄造成的月日期時序中斷的情況?
a.???存儲過程調(diào)用
這里不再贅述。
b.???sql變量控制
指定數(shù)據(jù)條數(shù),生成連續(xù)的數(shù)字或日期。
涉及到的知識點是變量,DATE_SUB(),DATE_FORMAT().使用以上方法的好處就是不用創(chuàng)建存儲過程,也不涉及到任何表。缺點就是數(shù)據(jù)的條數(shù)控制并不靈活,不能和用戶之間形成互動,即不能自定義日期區(qū)間,只能控制數(shù)據(jù)條數(shù)。
c.??利用現(xiàn)有含日期時間的表
要求是這個表中的數(shù)據(jù)足夠龐大,好處是不涉及存儲過程,不涉及變量,且能自定義日期區(qū)間。
綜合考慮,使用存儲過程調(diào)用。
mysql 存儲過程調(diào)用
可以理解為建立標(biāo)準(zhǔn)日期時間表。
step1.創(chuàng)建存儲過程
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.存儲過程調(diào)用
CALL createDate();
日期匹配問題
這里可以這么處理
(1)? ?根據(jù)月度時序中的表來補(bǔ)全日期,
(2)? ?再根據(jù)日期來查詢進(jìn)出記錄,
(3)? ?根據(jù)卡號過濾人員,
(4)? ?根據(jù)記錄中的處理機(jī)設(shè)備編號來區(qū)分項目地。
這里就不存在問題了。
項目地匹配問題
設(shè)備和項目地綁定,這里可以這樣處理
(1)? ? 根據(jù)處理機(jī)設(shè)備來區(qū)分項目地
(2)? ? 根據(jù)記錄中上報的卡號識別人員信息
這里也不存在問題。
項目地進(jìn)出記錄匹配問題
上報數(shù)據(jù)中有時間、人員卡號、處理機(jī)編號、進(jìn)出狀態(tài)標(biāo)識,滿足匹配條件。
但是,因為意外造成的進(jìn)出記錄不匹配,會對報表統(tǒng)計造成致命錯誤。
因此這里重點說明下因為異常造成的數(shù)據(jù)匹配問題。
匹配模式
正常的匹配模式有下列幾種:
1.? ? ABAB
2.? ? BABA
3.? ? ABABA
4.? ? BABAB
5.? ? A
6.? ? B
其它的均為異常情況;
基于此,提供基本匹配算法。
基本思路:
(1)? ?匹配要素為A(進(jìn))B(出)
(2)? ?根據(jù)需要匹配的數(shù)據(jù)長度構(gòu)造上述6種匹配模式下的正確匹配數(shù)據(jù)組
(3)? ?篩選符合條件的數(shù)據(jù),重組新的數(shù)據(jù)組并標(biāo)識不匹配的數(shù)據(jù)到源數(shù)據(jù)組
構(gòu)造匹配數(shù)據(jù)組方法如下:

構(gòu)建滿足匹配模式的數(shù)據(jù)并標(biāo)識原始數(shù)據(jù)匹配情況的方法如下:

上述完成后,只需要解決數(shù)據(jù)的重發(fā)問題即可。
(1)? ? 數(shù)據(jù)重發(fā)問題,需要根據(jù)實際設(shè)備驗證。
(2)? ? 跨多天工作的情況:實際情況下會很少發(fā)生,上述計算時長均分割到當(dāng)天和前天,這樣理論上會造成實際時長缺失。建議配合提供管理制度解決。

數(shù)據(jù)去重
因為是根據(jù)時間去重的,記錄有進(jìn)出之分,且進(jìn)出需要考核時長,因此需要根據(jù)客戶要求靈活控制去重時間和保留進(jìn)出記錄的哪一種。



