我正在尝试使用以下查询创建表:
create table customer1
(
custmer_id number,
Customer_name varchar(20),
Expiry_date date default TO_DATE ('31-12-2009','dd-mon-RR')
)
结果是以下错误:
Error report -
ORA-01843: not a valid month
01843. 00000 - "not a valid month"
*Cause:
*Action:
任何人都可以对此轻描淡写。 谢谢。
答案 0 :(得分:2)
[TL; DR] 使用日期文字:
CREATE TABLE customer1 (
custmer_id NUMBER,
Customer_name VARCHAR2(20),
Expiry_date DATE DEFAULT DATE '2009-12-31'
)
或MM
格式模型:
CREATE TABLE customer1 (
custmer_id NUMBER,
Customer_name VARCHAR2(20),
Expiry_date DATE DEFAULT TO_DATE ('31-12-2009','DD-MM-RRRR')
)
摘自Oracle Datetime Format Models:
MM
:月份(01-12;一月= 01)。MON
:月份的缩写。MONTH
:月份名称,用空格填充以显示用于该元素的日期语言中月份最宽名称的宽度。Oracle的String-to-Date Conversion Rules允许其他格式设置规则(不应用任何其他修饰符)。所以:
MM
也匹配MON
和MONTH
; MON
与MONTH
匹配(反之亦然); RR
匹配RRRR
;和您使用的格式模型dd-mon-RR
可以与以下任何一种匹配(带或不带连字符):
31-dec-09
31-december-09
31-dec-2009
31-december-2009
但是MON
格式模型也不匹配MM
格式,因此不能匹配您的字符串。
相反,您应该使用DD-MM-RR
(或DD-MM-RRRR
)格式模型,该模型可以匹配(同样,带或不带连字符):
31-12-09
31-dec-09
31-december-09
31-12-2009
31-dec-2009
31-december-2009
如果您只想匹配单个日期格式,则可以选择:
DATE '2009-12-31'
(仅使用ISO-8601日期格式,因此跳过了与格式模型不匹配的输入问题);或FX
格式模型修饰符TO_DATE( '31-12-2009', 'FXDD-MM-RRRR' )
,它将阻止应用字符串到日期转换规则,并要求输入与格式模型完全匹配。答案 1 :(得分:1)
格式掩码错误。 12 = mon
(它是mm
)也不是2009 = RR
(它是RRRR
)。
切换到
create table customer1
(
custmer_id number,
Customer_name varchar(20),
Expiry_date date default TO_DATE ('31-12-2009','dd-mm-RRRR')
)