DB2 / 400 select * работает, но count (*) не работает - PullRequest
2 голосов
/ 27 сентября 2019

Я натолкнулся на странную странность, пытаясь найти некоторые записи для страховой системы.Кажется, что запрос запускается, когда я говорю select , но при подсчете подсчитывает формат даты ().Немного предыстории, наши даты хранятся в виде целых (да, я знаю, что это ужасно) одним из двух способов.YYMMDD за годы до 2000 года, CYYMMDD за 1999 год.

  1. 21 октября 1999 года становится 991021
  2. 21 октября 2000 года становится 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;

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

Создайте следующий UDF SQL:

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
3 голосов
/ 27 сентября 2019

select count(*) вернет только 1 строку, поэтому fetch first 100 rows only не имеет никакого влияния.

Таким образом, ваш первый запрос читает только 100 строк.

Второй запрос читает всестрок.Где-то в последующих строках у вас есть неверные данные в вашем поле A08.

Лучшее решение - иметь пользовательскую функцию (UDF), которую вы можете вызывать для преобразования дат, это позволит вам обрабатыватьневерные данные ... либо возвращение NULL, либо возвращение какой-либо действительной даты.

Вы можете свернуть свой UDF или использовать открытый исходный код Алана Кэмпина iDate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...