1

以下查询给出错误:

SELECT to_char(last_day(add_months(to_char(to_date('01-02-2013','dd-mm-yyyy'),
    'dd-MON-yyyy'),-1)) + 1,'dd-mm-yyyy') FROM dual;

ORA-01858: a non-numeric character was found where a numeric was expected

我在两个系统上试过这个:

  1. 使用 NLS_DATE_FORMAT='DD-MON-RR' - 此查询工作正常。

  2. 使用 NLS_DATE_FORMAT='MM-DD-YYYY' - 给我错误ORA-01858: a non-numeric character was found where a numeric was expected

关于此查询为何失败的任何线索?我不能让查询依赖于 DATE 格式。

4

2 回答 2

3

为什么在调用 add_months 时要执行 to_char ,您需要传递一个日期,例如

SELECT to_char(last_day(add_months(to_date('01-02-2013','dd-mm-yyyy'),
    ,-1)) + 1,'dd-mm-yyyy') FROM dual;
于 2013-02-18T18:26:27.337 回答
2

您在调用中有一个隐式的 char-to-date 转换add_months();您传递的参数是字符串,而不是日期。您的to_char()内部是多余的,当您的 NLS_DATE_FORMAT 与您在其中使用的格式不匹配时会导致错误to_char()

SELECT to_char(last_day(add_months(to_date('01-02-2013','dd-mm-yyyy'),-1)) + 1,
    'dd-mm-yyyy') FROM dual;

我不完全确定你在做什么......如果你想要那个日期所在月份的第一天,你可以这样做:

SELECT to_char(trunc(to_date('01-02-2013', 'dd-mm-yyyy'), 'MM'),
    'dd-mm-yyyy') FROM dual;

这使用该TRUNC(date)函数有效地向下舍入到月初。

于 2013-02-18T18:27:15.880 回答