违反oracle生日列正则表达式约束

9fkzdhlc  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(398)

我希望数据库中的所有日期都采用以下yyyy-mm-dd日期格式。例如,“2020-05-28”。但是,当我在包含生日列的用户表中插入日期时,这似乎不像我想象的那样有效。
以下是我的生日专栏:

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.
y3bcpkx1

y3bcpkx11#

你错误地解释了这个概念 DATE 数据类型。很可能,您混合了日期的显示格式(显示日期时看到的值) date 以及它们的内部表示。
date 只是:约会。它以某种特定于数据库的格式存储在内部,您无需担心。因此不需要使用check约束来控制格式。
无论何时需要显示日期,都可以使用函数 to_char() 将其格式化为字符串,如:

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

您还可以设置会话参数 NLS_DATE_FORMAT 因此,所有日期在显示时都会自动以给定格式格式化:

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

相关问题