如何解决此错误“ ORA-01843:无效月份”

时间:2018-12-04 09:42:00

标签: oracle

我正在尝试使用以下查询创建表:

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:

任何人都可以对此轻描淡写。 谢谢。

2 个答案:

答案 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也匹配MONMONTH
  • MONMONTH匹配(反之亦然);
  • 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')
)