Nam*_*ata 3 oracle datetime toad function to-date
我有一个脚本,用于编写函数和过程。该脚本在Oracle SQL Developer中绝对正常,没有任何错误或警告。我必须将此脚本提供给客户端客户。客户用户在其中运行相同的脚本TOAD,他得到错误消息
ORA-01830: date format picture ends before converting entire input string
在这种情况下,我真的不知道如何处理此类错误。这是错误TOAD吗?我在函数中使用to_date和 to_timestamp,但出现错误。
您要么依赖隐式日期转换,要么依赖隐式格式模型。因为您说过您正在使用to_date,to_timestamp而且似乎是后者。您没有显示代码,但错误表明您正在使用期望看到的格式的字符串值调用这些函数,但未明确提供格式模型作为该函数的第二个参数。这将导致使用会话的NLS_DATE_FORMAT设置。如果您这样做:
to_date('12/06/2015 09:10:11')
Run Code Online (Sandbox Code Playgroud)
那么您实际上是在有效地做:
to_date('12/06/2015 09:10:11', (select value from nls_session_parameters where parameter = 'NLS_DATE_FORMAT'))
Run Code Online (Sandbox Code Playgroud)
您无法控制客户如何配置其NLS环境,因此您永远不应依赖隐式转换或NLS假设。
如文档中所述:
警告:
最好始终使用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
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,您应避免使用月份名称,因为它们的解释取决于NLS_DATE_LANGUAGE;但如果确实需要,您至少可以在查询级别覆盖它。
如果使用固定值,则可能还需要考虑日期和时间戳文字:
select date '2015-06-12' ...
select timestamp '2015-06-12 09:10:11' ...
Run Code Online (Sandbox Code Playgroud)
但是如果您要构造要转换为日期的字符串,则不合适。