我在 PL/SQL 中编写了一个例程来尝试匹配可能存在印刷/数据输入错误的日期。
它有效,但我想看看是否有人有其他/更好的想法。该例程不需要在 PL/SQL 中,因为我阅读了许多语言。
FUNCTION FUZZY_DATE_MATCH(IN_DATE_1 DATE, IN_DATE_2 DATE) RETURN NUMBER AS
MONTH_1 NUMBER(2);
MONTH_2 NUMBER(2);
DAY_1 NUMBER(2);
DAY_2 NUMBER(2);
YEAR_1 NUMBER(4);
YEAR_2 NUMBER(4);
MATCH_SCORE NUMBER(3) := 0;
BEGIN
IF TRUNC(IN_DATE_1) = TRUNC(IN_DATE_2)
THEN
MATCH_SCORE := 100;
ELSE
IF ABS(TRUNC(IN_DATE_1) - TRUNC(IN_DATE_2)) < 2
THEN
MATCH_SCORE :=50;
ELSE
MONTH_1 := TO_NUMBER(TO_CHAR(IN_DATE_1,'MM'));
MONTH_2 := TO_NUMBER(TO_CHAR(IN_DATE_2,'MM'));
IF MONTH_1 = MONTH_2
THEN
MATCH_SCORE := MATCH_SCORE + 15;
ELSE
IF (ABS(MONTH_1 - MONTH_2) < 2) OR
(TO_NUMBER(SUBSTR(LPAD(MONTH_1,2,'0'),2,1)||SUBSTR(LPAD(MONTH_1,2,'0'),1,1)) = MONTH_2)
THEN
MATCH_SCORE := MATCH_SCORE + 7;
END IF;
END IF;
DAY_1 := TO_NUMBER(TO_CHAR(IN_DATE_1,'DD'));
DAY_2 := TO_NUMBER(TO_CHAR(IN_DATE_2,'DD'));
IF DAY_1 = DAY_2
THEN
MATCH_SCORE := MATCH_SCORE + 10;
ELSE
IF (ABS(DAY_1 - DAY_2) < 2) OR
(TO_NUMBER(SUBSTR(LPAD(DAY_1,2,'0'),2,1)||SUBSTR(LPAD(DAY_1,2,'0'),1,1)) = DAY_2)
THEN
MATCH_SCORE := MATCH_SCORE + 5;
END IF;
END IF;
YEAR_1 := TO_NUMBER(TO_CHAR(IN_DATE_1,'YYYY'));
YEAR_2 := TO_NUMBER(TO_CHAR(IN_DATE_2,'YYYY'));
IF YEAR_1 = YEAR_2
THEN
MATCH_SCORE := MATCH_SCORE + 25;
ELSE
IF (ABS(YEAR_1 - YEAR_2) < 2) OR
(TO_NUMBER(SUBSTR(LPAD(YEAR_1,2,'0'),4,1)||SUBSTR(LPAD(YEAR_1,2,'0'),3,1)) = TO_NUMBER(SUBSTR(TO_CHAR(YEAR_2),3)))
THEN
MATCH_SCORE := MATCH_SCORE + 12;
END IF;
END IF;
END IF;
END IF;
RETURN MATCH_SCORE;
END FUZZY_DATE_MATCH;
基本概念是比较两个日期并返回一个介于 0 和 100 之间的值,其中 100 是完全匹配,0 是不匹配。我正在寻找的错误类型是个位数错误和转置错误。我的假设是年比月重,而月又比天重。
我尝试使用谷歌搜索模糊日期匹配,但答案通常处理日期之间的距离,而不是数据输入错误。
A感谢所有帮助。
保罗