如下SQL是查询上班刷卡异常,INTIME排班上班,OUTTIME排班下班,
有考勤卡,无门禁卡或门禁卡时间>=考勤卡时间,显示考勤时间对应每笔门禁时间,不使用MIN(FF_MJ.FGT02),但并未显示出有考勤无门禁卡的,
请协助修改,并优化oracle如下SQL性能,提高执行效率和减少资源占用:SELECT 'ON',
BASE.WORK_DATE,
'',
BASE.PLANT,
'',
BASE.EMP_CODE,
BASE.EMPNAME,
BASE.RANK_NAME,
BASE.ORG_CODE,
BASE.ORG_NAME,
BASE.EMPTYPE,
BASE.DUTY_NAME,
BASE.HOLIDAY,
BASE.WS_NUMBER,
BASE.WS_SIMPLE_NAME,
BASE.DAYTYPE,
BASE.INTIME,
BASE.OUTTIME,
KQ_REC.FGT02 AS KQ_FGT02, -- 考勤卡时间
MJ_REC.FGT02 AS MJ_FGT02, -- 每笔门禁时间
NULL AS MJ_FGT03,
NULL, NULL, NULL, NULL,
'LSHR', SYSDATE, 'SP_SYNC_KQ_MJ_CARD_EXP'
FROM (
SELECT
T.WORK_DATE,
DECODE(P.WORK_PLACE, 0, '一园', 1, '二园', 2, '三园', 'NULL') AS PLANT,
T.EMP_CODE, T.EMPNAME, P.RANK_NAME, P.ORG_CODE, P.ORG_NAME,
P.EMPTYPE, P.DUTY_NAME,
DECODE(D.DATE_STATUS, 0, 'N', 1, 'H', 3, 'S') AS HOLIDAY,
T.WS_NUMBER, T.WS_SIMPLE_NAME,
DECODE(T.WS_INTERVAL, 0, '白班', 1, '晚班') AS DAYTYPE,
T.INTIME, T.OUTTIME
FROM HCP.LSHR_CARDING_V T
JOIN HCP.TZ_EMP_IN P ON T.EMP_CODE = P.EMPCODE
JOIN HCP.V_CLK_TZ_EMP_CALENDER_INFO D
ON T.EMP_CODE = D.EMP_CODE AND T.WORK_DATE = D.CLD_DATE
WHERE T.WORK_DATE = TRUNC(SYSDATE) - 2
) BASE
-- 考勤卡记录(必须存在)
JOIN HCP.FGT_FILE_KQMJ KQ_REC
ON KQ_REC.FGT10 = BASE.EMP_CODE
AND KQ_REC.FGT03 = '1'
AND LENGTH(KQ_REC.FGT08) = 5
AND SUBSTR(KQ_REC.FGT08, 3, 1) IN ('1','2')
AND KQ_REC.FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24
-- 门禁卡记录(左连接,允许不存在)
LEFT JOIN HCP.FGT_FILE_KQMJ MJ_REC
ON MJ_REC.FGT10 = BASE.EMP_CODE
AND MJ_REC.FGT03 = '1'
AND LENGTH(MJ_REC.FGT08) = 5
AND SUBSTR(MJ_REC.FGT08, 3, 1) = '3'
AND MJ_REC.FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24
WHERE
-- 异常条件:无门禁卡或门禁时间≥考勤时间
(MJ_REC.ROWID IS NULL OR MJ_REC.FGT02 >= KQ_REC.FGT02)
-- 确保考勤卡是最新记录(避免重复)
AND KQ_REC.FGT02 = (
SELECT MAX(FGT02)
FROM HCP.FGT_FILE_KQMJ
WHERE FGT10 = BASE.EMP_CODE
AND FGT03 = '1'
AND LENGTH(FGT08) = 5
AND SUBSTR(FGT08, 3, 1) IN ('1','2')
AND FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24
);
最新发布