Oracle Нарушено ограничение регулярного выражения столбца дня рождения - PullRequest
0 голосов
/ 29 мая 2020

Я хочу, чтобы все мои даты в моей базе данных были в следующем формате даты гггг-мм-дд. Например, «2020-05-28». Но это, похоже, не работает, как я думал, когда я вставляю дату в свою таблицу User, которая содержит столбец дня рождения.

Вот ограничение столбца моего дня рождения:

birthday DATE NOT NULL CHECK (REGEXP_LIKE(birthday , '\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])*')),

Я получаю следующую ошибку, когда пытаюсь вставить: «2020-05-28» или любую другую дату в этом отношении:

02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named check

*Action:   do not insert values that violate the constraint.

1 Ответ

2 голосов
/ 29 мая 2020

Вы неправильно интерпретируете концепцию типа данных DATE. Вероятно, вы смешиваете формат отображения дат (значение, которое вы видите при отображении значения date) и их внутреннее представление .

A date и есть свидание. Он хранится внутри в некотором формате c базы данных, о котором вам не нужно беспокоиться. Таким образом, нет необходимости в проверочном ограничении для управления форматом.

Когда вам нужно отобразить дату, вы можете использовать функцию to_char(), чтобы отформатировать ее как строку, например:

to_char(birthday, 'yyyy-mm-dd')

Вы также можете установить параметр сеанса NLS_DATE_FORMAT, чтобы все даты автоматически формировались в заданном формате при отображении:

alter session set nls_date_format = 'yyyy-mm-dd';
...