问题

我在尝试检索保险系统的一些记录时遇到了奇怪的怪异。 当我说select时,查询似乎运行,但当我执行count()时,它会导致日期格式. 有一点背景,我们的日期以两种方式之一存储为ints(是的,我知道它是horrid). yymmmdd,2000年之前,CYYMMDD,1999年.

  1. 1999年10月21日变为991021
  2. 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
 

  相同标签的其他问题

sqldb2ibm-midrange