Ошибка в функции, которая преобразует строку в допустимую дату - PullRequest
1 голос
/ 03 марта 2020

Я использую эту функцию в течение последних нескольких лет, которая преобразует входную строку в действительную дату в определенном формате.

select FN_RETURN_VALID_DATE('20200228005815354241') from dual;

Вышеприведенный запрос вернется, 28-02-2002 00:58: 15

Однако, начиная с 29/02/2020, если строка ввода функции изменится на '202002 29 005947354241', она вернет ноль! Я не уверен, что это что-то связано с високосным годом, но пока не могу это выяснить.

Определение функции:

CREATE OR REPLACE FUNCTION "FN_RETURN_VALID_DATE" ( v_STR IN VARCHAR2 ) RETURN 
DATE
IS
BEGIN
RETURN TO_DATE
( 
    substr(v_STR, 7, 2) || '-' || 
    substr(v_STR, 5, 2) || '-' ||  
    substr(v_STR, 2, 2) || ' ' ||
    substr(v_STR, 9, 2) || ':' || 
    substr(v_STR, 11, 2) || ':' || 
    substr(v_STR, 13, 2), 'DD-MM-YY HH24:MI:SS') ;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;

Я проверил, что нет ошибки, когда Я проверил, получил ли я это сообщение «ORA-0000: нормальное, успешное завершение». Пожалуйста, дайте мне знать, в чем может быть проблема.

С уважением, S

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Проблема связана с форматом года, если вы используете 2-ди git год, формат «RR» покажет вам текущий век. Однако лучше всего использовать формат 4 di git Year, чтобы избежать путаницы

CREATE OR REPLACE FUNCTION "FN_CHK_VALID_DATE" ( v_STR IN VARCHAR2 ) RETURN 
DATE
IS
BEGIN
RETURN TO_DATE
( 
    substr(v_STR, 7, 2) || '-' || 
    substr(v_STR, 5, 2) || '-' ||  
    substr(v_STR, 0, 4) || ' ' ||
    substr(v_STR, 9, 2) || ':' || 
    substr(v_STR, 11, 2) || ':' || 
    substr(v_STR, 13, 2), 'DD-MM-YYYY HH24:MI:SS') ;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;
1 голос
/ 03 марта 2020

Это может быть просто сделано в чистом виде SQL:

with data as(
    select '20200229005947354241' input_dt from dual
)
select input_dt, 
       to_char(
           to_date(
               substr(input_dt, 1, 14), 
               'YYYY-MM-DD HH24:MI:SS'), 
          'DD-MM-YYYY HH24:MI:SS') dt 
from data;

INPUT_DT             DT                 
-------------------- -------------------
20200229005947354241 29-02-2020 00:59:47

Еще одна вещь в вашем коде, которая действительно опасна:

EXCEPTION
WHEN OTHERS THEN
RETURN NULL;

Это ошибка, ожидающая своего шанса на нарушить атомарность процедурного вызова. Вы скрываете ошибку в своем коде. Пожалуйста, смотрите КОГДА ДРУГОЕ - Ошибка

...