ORA-01843:不是有效月份 - 但是月份格式是什么? Oracle 11g

时间:2015-01-16 10:22:18

标签: date oracle11g

我想知道除MM,MONTH或MON之外还存在哪些其他MONTH格式。 当下面的查询运行时,它给我一个错误ORA-01843:不是一个有效的月份,我可以理解为什么,因为服务器删除了" 0"从月份" 07"并且只留下数字" 7",因此MM格式不正确。 但是它是哪一个?

select to_char(to_date(START_DATE,'MM/DD/YYYY '), 'DD-MM-YYYY')
from PER_ALL_PEOPLE_F
WHERE person_id=12345

START_DATE列为DATE TYPE,它提供的结果如下:7/17/2012。

1 个答案:

答案 0 :(得分:3)

您认为本月的单位数7是个问题并不正确; Oracle通常非常灵活,并且很乐意使用MM模型解析单个数字月份:

select to_date('7/17/2012', 'MM/DD/YYYY') from dual;

TO_DATE('7/17/2012'
-------------------
2012-07-17 00:00:00

如果start_date已经是DATE类型,那么您不应该为此to_date()调用。您正在使用NLS_DATE_FORMAT模型对字符串进行隐式转换,然后返回到指定格式的日期。所以你真的在做:

select to_char(to_date(to_char(START_DATE, <NLS_DATE_FORMAT>),
   'MM/DD/YYYY '), 'DD-MM-YYYY')

如果您的NLS_DATE_FORMAT不是MM/DD/YYYY,例如DD-MON-YYYY,那么您至少会在某些值上收到ORA-1843错误。

你可以看到:

select to_date(date '2014-01-16', 'MM/DD/YYYY') from dual;

或扩展名:

select to_date(to_char(date '2014-01-16', 'DD-MON-YYYY'),
  'MM/DD/YYYY') from dual;

日期没有任何特定格式,它们存储在内部表示中,然后转换为格式化字符串以供显示。您说您的日期显示为2012年7月12日,但如果您发现错误,则表明您的客户似乎是在格式化,并且它与会话NLS_DATE_FORMAT无关。

你只需要这样做:

select to_char(START_DATE, 'DD-MM-YYYY')