2017-08-11 74 views
1

我们有以下查询像甲骨文日期为MON-DD给ORA-01839:日期无效月指定

SELECT TO_DATE(CREATED_DATE_IN_CHAR,'MON-DD') FROM TABLE1 

数据的列是MON-DD的格式相同。

在执行上述查询时,我们得到了ORA-01839:date指定的月份无效。 通过进一步分析,我们发现created_date_in_char具有类似'FEB-29'的值。因此,oracle正在尝试将2017年的“FEB-29”转换为“29 -FEB-17”(当前年份为2017年),这不是有效日期。

是否可以使to_date函数日期转换的闰年,而不是当前年份(2017年)。

我们卡在这里。任何帮助或建议表示赞赏。

+1

嗯......也许最好的事情是控制日期输入进入您的查询。如果从应用层完成,例如Android或者移动应用程序,您可以使用一个呈现正确日历的小部件。 –

+0

@TimBiegeleisen感谢您的输入。但要求是从应用程序层(UI)获取相同格式的日期。用户只能在UI中选择MON-DD。 – Hariharan

回答

0

您不能让to_date()假设为不同的年份,但您可以通过将它作为字符串的一部分传入来使用特定年份(任何一年是闰年) - 只是将固定值连接起来,并修改格式模式匹配:

SELECT TO_DATE('2016-' || CREATED_DATE_IN_CHAR,'YYYY-MON-DD') FROM TABLE1 

快速演示:

alter session set nls_date_format = 'YYYY-MM-DD'; -- for display only 

with table1 (created_date_in_char) as (
    select 'JAN-01' from dual 
    union all select 'FEB-29' from dual 
    union all select 'DEC-31' from dual 
) 
SELECT TO_DATE('2016-' || CREATED_DATE_IN_CHAR,'YYYY-MON-DD') FROM TABLE1; 

TO_DATE('2 
---------- 
2016-01-01 
2016-02-29 
2016-12-31 

这似乎很奇怪的和无益的存储创建日期(或日期)刚刚月份和日期,或任何日期作为一个字符串;但这不是直接的问题...