ORA-01830:日期格式图片在转换TOAD中的整个输入字符串之前结束

时间:2015-06-12 10:02:16

标签: oracle function datetime toad to-date

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

  

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

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

1 个答案:

答案 0 :(得分:5)

您依赖隐式日期转换或隐式格式模型;既然你说你正在使用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' ...

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