【问题标题】:Why am I receiving an error for TRUNC function?为什么我收到 TRUNC 函数错误?
【发布时间】:2017-06-25 19:42:44
【问题描述】:
select TRUNC(TO_DATE('22-AUG-03'), 'YEAR')
from dual;

ORA-01843: 月份无效

第一个例子 -> https://www.techonthenet.com/oracle/functions/trunc_date.php

我知道“trunc”函数接受一个日期和可选的 fmt 参数。 为什么我会收到此错误?

【问题讨论】:

  • 刚刚尝试过,它工作正常,如该教程中所述。请参阅此小提琴,例如 sqlfiddle.com/#!4/68b32/1521
  • 它是否适用于 Oracle 12c?
  • 您忘记在TO_DATE('22-AUG-03') 中指定格式。所以你相信某些会话设置和你的运气。不。如果您想要日期文字,请使用日期文字,而不是使用必须转换的字符串文字:DATE '2003-08-22'。如果您必须转换包含日期和月份名称的字符串,请确保指定格式语言:TO_DATE('22-AUG-03', 'DD-MON-RR ', 'NLS_DATE_LANGUAGE=AMERICAN')`
  • 养成始终使用四位数年份的习惯。现在是 2017 - 不要编写有 Y2K 错误的新代码

标签: oracle date oracle12c truncate


【解决方案1】:

我认为问题不在于trunc()。我认为问题在于日期格式。使用 date 关键字和 ISO 标准格式的日期会更安全:

select TRUNC(DATE '2003-08-22', 'YEAR')
from dual;

日期字符串的解释取决于特定环境的国际化设置。上面没有那个依赖。

【讨论】:

    【解决方案2】:

    这是一个非常简单的检查:在您的 SELECT 失败的同一会话中,并且您不更改 NLS_DATE_FORMAT,看看如果您运行更简单的语句会发生什么,

    SELECT TO_DATE('22-AUG-03') FROM DUAL
    

    你会得到同样的错误——最终证明它与TRUNC()无关。

    要使一切都按照教程中的方式进行,请发出命令

    ALTER SESSION SET NLS_DATE_FORMAT = 'dd-MON-yy'
    

    首先,在其他一切之前。请注意,在大多数情况下,将年份作为两位数而不是四位的格式是一个非常糟糕的主意。

    【讨论】:

      【解决方案3】:

      看来您想获取参数中收到的日期的年份 如果您将 '22-AUG-03' 作为参数,请将您期望的日期格式添加到 TO_DATE 函数中,然后将其截断:

      SELECT TRUNC(TO_DATE('22-AUG-03', 'dd-MON-yy'),'YEAR') FROM DUAL
      

      【讨论】:

        【解决方案4】:

        使用 SELECT EXTRACT(YEAR FROM TO_DATE('22-AUG-03', 'dd-MON-yy')) FROM DUAL; 从日期中提取年份。

        【讨论】:

          猜你喜欢
          • 2021-02-10
          • 1970-01-01
          • 2019-12-05
          • 2019-08-19
          • 1970-01-01
          • 2020-02-04
          • 2019-10-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多