我在尝试检索保险系统的一些记录时遇到了一个奇怪的怪现象。
当我说select时,查询似乎在运行,但是当我执行count()时,它却在抱怨日期格式。
有点背景,我们的日期以两种方式之一存储为整数(是的,我知道这很可怕)。 YYMMDD适用于2000年之前的年份,CYYMMDD适用于1999年。
1999年10月21日成为991021
2000年10月21日变为1001021。
这是下面的代码,我已经评论了可行的方法,包括无效的错误。
IBM大约在1980年出现了执行不力的想法。
-- returns rows correctly
select * from mudata.hdk01
where date(to_date(to_char(A08 + 19000000, '99999999'), 'YYYYMMDD')) < '01/01/1999'
fetch first 100 rows only;
-- refuses with error
-- java.sql.SQLException: [SQL0181] Value in date, time, or timestamp string not valid.
-- Query 1 of 1, Rows read: 0, Elapsed time (seconds) - Total: 0.093, SQL query: 0.093, Reading results: 0
select count(*) from mudata.hdk01
where date(to_date(to_char(A08 + 19000000, '99999999'), 'YYYYMMDD')) < '01/01/1999'
fetch first 100 rows only;
最佳答案
创建以下SQL UDF:
CREATE OR REPLACE FUNCTION TO_DATE_SAFE (P_DT INT)
RETURNS DATE
DETERMINISTIC
NO EXTERNAL ACTION
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
RETURN date(to_date(to_char(P_DT + 19000000, '99999999'), 'YYYYMMDD'));
END
并使用以下语句查找具有违反规则的值的行:
select A08
from mudata.hdk01
where to_date_safe(A08) is null and A08 is not null