Oracle 如何修复此错误';ORA-01843:不是有效月份';

Oracle 如何修复此错误';ORA-01843:不是有效月份';,oracle,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:

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

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:
任何人都可以告诉我这件事。
谢谢。

格式错误。既不是
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')
)

错误的格式掩码。既不是
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')
)

[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的:

  • MM
    :月份(01-12;一月=01)
  • MON
    :月份的缩写名称
  • MONTH
    :月份名称,用空格填充以显示此元素使用的日期语言中最宽月份名称的宽度
Oracle允许附加格式规则(不应用任何其他修饰符)。因此:

  • MM
    也与
    MON
    MONTH
    匹配
  • MON
    匹配
    MONTH
    (反之亦然)
  • RR
    匹配
    rrrrr
    ;及
  • 标点符号是可选的
您正在使用的格式模型
dd-mon-RR
可以与以下任何格式匹配(带或不带连字符):

  • 2009年12月31日
  • 2009年12月31日
  • 2009年12月31日
  • 2009年12月31日
但是
MON
格式模型与
MM
格式不匹配,因此无法与字符串匹配

相反,您应该使用
DD-MM-RR
(或
DD-MM-RRRR
)格式模型,可以匹配(同样,有或没有连字符):

  • 31-12-09
  • 2009年12月31日
  • 2009年12月31日
  • 31-12-2009
  • 2009年12月31日
  • 2009年12月31日
如果您只想匹配单一日期格式,则:

  • 使用日期文字
    日期“2009-12-31”
    (它仅使用ISO-8601日期格式,因此跳过输入与格式模型不匹配的问题);或
  • 使用“格式精确”
    FX
    格式模型修饰符
    到日期('31-12-2009','FXDD-MM-RRRR')
    ,这将阻止应用字符串到日期的转换规则,并要求输入与格式模型完全匹配

[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的:

  • MM
    :月份(01-12;一月=01)
  • MON
    :月份的缩写名称
  • MONTH
    :月份名称,用空格填充以显示此元素使用的日期语言中最宽月份名称的宽度
Oracle允许附加格式规则(不应用任何其他修饰符)。因此:

  • MM
    也与
    MON
    MONTH
    匹配
  • MON
    匹配
    MONTH
    (反之亦然)
  • RR
    匹配
    rrrrr
    ;及
  • 标点符号是可选的
您正在使用的格式模型
dd-mon-RR
可以与以下任何格式匹配(带或不带连字符):

  • 2009年12月31日
  • 2009年12月31日
  • 2009年12月31日
  • 2009年12月31日
但是
MON
格式模型与
MM
格式不匹配,因此无法与字符串匹配

相反,您应该使用
DD-MM-RR
(或
DD-MM-RRRR
)格式模型,可以匹配(同样,有或没有连字符):

  • 31-12-09
  • 2009年12月31日
  • 2009年12月31日
  • 31-12-2009
  • 2009年12月31日
  • 2009年12月31日
如果您只想匹配单一日期格式,则:

  • 使用日期文字
    日期“2009-12-31”
    (它仅使用ISO-8601日期格式,因此跳过输入与格式模型不匹配的问题);或
  • 使用“格式精确”
    FX
    格式模型修饰符
    到日期('31-12-2009','FXDD-MM-RRRR')
    ,这将阻止应用字符串到日期的转换规则,并要求输入与格式模型完全匹配

或日期文字,即
日期'2009-12-31'
至日期('31-12-2009','dd-mm-YYYY')
-我只喜欢
RR
两位数字,但由于我在计算机上工作超过18年,实际上我根本不使用
RR
)或日期文字,即
日期'2009-12-31'
至日期('31-12-2009','dd-mm-YYYY')
-我只喜欢两位数的
RR
,但由于我在计算机上工作了18年多,实际上我根本不使用
RR
:-)