【问题标题】:oracle to date for MON-DD gives ORA-01839: date not valid for month specifiedoracle to date for MON-DD 给出 ORA-01839: date not valid for month specified
【发布时间】:2017-08-11 17:05:10
【问题描述】:

我们有一个类似的查询

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

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

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

是否可以让 to_date 函数采用闰年而不是当前年份(2017 年)进行日期转换。

我们被困在这里。感谢任何帮助或建议。

【问题讨论】:

  • 嗯...也许最好的办法是控制进入查询的日期输入。如果从应用层完成,例如Android 或移动应用程序,您可以使用显示正确日历的小部件。
  • @TimBiegeleisen 感谢您的意见。但要求是从应用层(UI)获取相同格式的日期。用户只能在 UI 中选择 MON-DD。

标签: oracle11g to-date


【解决方案1】:

您不能让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

将创建的日期(或任何日期)存储为月份和日期,或将任何日期存储为字符串似乎很奇怪且无益;但这不是当前的问题...

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2013-03-02
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多