【问题标题】:ORA-01830: date format picture ends before converting entire input string in TOADORA-01830: 日期格式图片在 TOAD 中转换整个输入字符串之前结束
【发布时间】:2015-06-12 10:02:16
【问题描述】:

我有一个脚本,我在其中编写函数和过程。该脚本在 Oracle SQL 开发人员中运行良好,没有任何错误或警告。这个脚本我必须提供给客户端客户。客户用户在TOAD 中运行相同的脚本并收到错误消息

ORA-01830: date format picture ends before converting entire input string

在这种情况下,我真的不知道如何处理这样的错误。这是TOAD 中的错误吗? 我在函数中使用了to_dateto_timestamp,但出现错误。

【问题讨论】:

  • 这将有助于显示您的代码。但是您在某处依赖 NLS_DATE_FORMAT ,并且在两个客户端中具有不同的值会导致不同的行为。永远不要依赖它,始终使用显式格式掩码...
  • 感谢亚历克斯的回复。我的函数代码非常大,这就是为什么我没有提及我的代码,并且我在导致问题的函数中使用了 to_date 和 to_timestamp。我不明白你的意思是使用显式格式掩码是什么意思?是的,我更改了我的 sql 开发人员中的 NLS_DATE_FORMAT 设置以获取时间戳值。但是如何在 TODE 中解决这个问题呢?
  • 不要更改客户端中的 NLS_DATE_FORMAT;不要依赖它,将您设置的相同值(例如'DD/MM/YYYY HH24:MI:SS')传递给to_date()作为第二个参数;文档中显示的 fmt
  • 感谢 Alex,我会检查文档并尝试解决此问题。

标签: oracle function datetime toad to-date


【解决方案1】:

您要么依赖隐式日期转换,要么依赖隐式格式模型;既然您说您使用的是to_dateto_timestamp,它似乎是后者。您尚未显示您的代码,但该错误表明您正在使用您希望看到的格式的字符串值调用这些函数,但没有明确提供格式模型作为函数的第二个参数。这将导致使用会话的 NLS_DATE_FORMAT 设置。如果你这样做:

to_date('12/06/2015 09:10:11')

那你真的很有效:

to_date('12/06/2015 09:10:11', (select value from nls_session_parameters where parameter = 'NLS_DATE_FORMAT'))

您无法控制您的客户将如何配置他们的 NLS 环境,因此您永远不应依赖隐式转换或 NLS 假设。

正如它所说的in the documentation

注意:
始终使用 TO_DATE 指定格式掩码 (fmt) 是一种很好的做法,如以下部分中的示例所示。当它不带格式掩码使用时,仅当 char 使用与 NLS_TERRITORY 或 NLS_DATE_FORMAT 参数确定的相同格式时,该函数才有效。此外,除非指定显式格式掩码以避免依赖关系,否则该函数可能在数据库之间不稳定。

你可以看到这如何影响一个简单的查询:

SQL> alter session set nls_date_format = 'DD/MM/YYYY HH24:MI:SS';

Session altered.

SQL> select to_date('12/06/2015 09:10:11') from dual;

TO_DATE('12/06/2015
-------------------
12/06/2015 09:10:11

SQL> alter session set nls_date_format = 'DD/MM/YYYY';

Session altered.

SQL> select to_date('12/06/2015 09:10:11') from dual;
select to_date('12/06/2015 09:10:11') from dual
               *
ERROR at line 1:
ORA-01830: date format picture ends before converting entire input string

出于同样的原因,您应该避免使用月份名称,因为它们的解释取决于 NLS_DATE_LANGUAGE;如果你真的需要的话,你至少可以在查询级别覆盖它。

如果您使用固定值,您可能还需要考虑日期和时间戳文字:

select date '2015-06-12' ...
select timestamp '2015-06-12 09:10:11' ...

但如果您正在构建要转换为日期的字符串,那么这将是不合适的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多