添加日期范围校验约束报错:literal does not match format string
问题解决:Oracle建表CHECK约束日期字面量格式错误
你遇到的literal does not match format string错误,是因为Oracle中使用date '字符串'语法时,字符串格式必须和当前会话的NLS_DATE_FORMAT参数匹配,而你用的01/01/1904格式大概率和默认设置不兼容(Oracle默认常见格式是DD-MON-RR,比如01-JAN-04)。
给你两种可靠的解决方法:
方法1:使用ANSI标准日期字面量(推荐)
ANSI标准的日期格式YYYY-MM-DD不受NLS参数影响,兼容性最强,直接修改CHECK约束里的日期即可:
create table guest ( Guest_ID varchar2(8) primary key, Family_Name varchar2(20) not null, Given_Name varchar2(20) not null, Date_of_Birth date check (Date_of_Birth between date '1904-01-01' and date '2004-01-01') not null, Address varchar2(80) not null );
方法2:用TO_DATE函数指定格式
如果坚持要用MM/DD/YYYY格式,就用TO_DATE函数明确指定格式掩码,让Oracle能正确解析:
create table guest ( Guest_ID varchar2(8) primary key, Family_Name varchar2(20) not null, Given_Name varchar2(20) not null, Date_of_Birth date check (Date_of_Birth between to_date('01/01/1904', 'MM/DD/YYYY') and to_date('01/01/2004', 'MM/DD/YYYY')) not null, Address varchar2(80) not null );
另外提一句,你语句里not null放在CHECK约束后面的写法是没问题的,Oracle会正确识别这个字段非空的要求。
内容的提问来源于stack exchange,提问作者ICARO
相关产品推荐
相关产品推荐

