Не используйте регулярное выражение, так как крайние значения сделают выражение длинным и сложным (т. Е. Месяцы могут иметь 28-31 день, високосные годы каждые 4 года ... за исключением кратных 100 ... кроме кратных из 400).
Например, регулярное выражение даты ^\d{4}(0[1-9]|(1[0-2]))(0[1-9]|[1-2][0-9]|3[0-1])$
будет проверять 20190229
или 20200230
или 20200931
, ни одна из которых не является действительной датой.
Регулярное выражение времени это проще, так как у вас есть только часы 0-23, минуты 0-59, секунды 0-59 (при условии, что вы игнорируете високосные секунды) и, возможно, дробные секунды и будут:
([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?
Однако, более простой способ это просто попытка выполнить преобразование в DATE
, и если он потерпит неудачу, вы знаете, что он недействителен. Если вы используете Oracle 12.2 или более позднюю версию, вы можете использовать встроенную функцию VALIDATE_CONVERSION
:
SELECT validate_conversion( '20200230000000' AS DATE, 'YYYYMMDDHH24MISS' )
FROM DUAL
Если вы используете более раннюю версию, вы можете создать пользовательская функция, чтобы попытаться выполнить преобразование, и если возникает исключение, то вы знаете, что ввод неверен:
CREATE FUNCTION isValidDate(
date_string IN VARCHAR2,
format_model IN VARCHAR2 DEFAULT 'FXYYYYMMDDHH24MISS'
) RETURN NUMBER
IS
d DATE;
BEGIN
d := TO_DATE( date_string, format_model );
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END;
/