01847. 00000 - “日期必须介于 1 和最后一天之间”
Posted
技术标签:
【中文标题】01847. 00000 - “日期必须介于 1 和最后一天之间”【英文标题】:01847. 00000 - "day of month must be between 1 and last day of month" 【发布时间】:2017-02-07 09:13:26 【问题描述】:create or replace procedure new_user as
begin
fnd_user_pkg.createuser('BOBBY','oracle123',TO_DATE('7-FEB-2017'),NULL,TO_DATE('20-02-17'),'80','78960','bobby@gmail.com');
end;
我正在使用如下命令调用上述程序:
exec new_user();
程序成功执行,但在执行时遇到错误是:
从第 7 行开始的错误命令 - BEGIN new_user();结尾;错误 报告 - ORA-01847: 日期必须介于 1 和最后一天之间 月 ORA-06512:在“APPS.NEW_USER”,第 3 行 ORA-06512:在第 1 行 01847. 00000 - “一个月中的某天必须介于 1 和该月的最后一天之间” *原因: *行动:
有人可以帮我吗?
【问题讨论】:
我永远不会解析没有任何格式掩码的日期,因为您以这种方式绑定了数据库提供的格式。如果它与您的格式不同,您将收到这样的异常。而且由于您已经提供了两种不同类型的格式,因此如果没有格式掩码,这注定会失败。 即使使用to_date
函数,如TO_DATE('07-02-2017','DD-MM-YYYY')
,您也应该发送日期格式
如果可能,您应该使用日期文字而不是转换字符串。日期文字如下所示:DATE '2017-02-07'
.
@ThorstenKettner 我很好奇你为什么说you _should_ use date literals ... instead of converting strings
... ANSI 日期文字是字符串到日期的转换! (无论如何,Oracle 在幕后将其转换为 to_date()
,正如检查 SELECT * FROM dual WHERE SYSDATE >= DATE '2017-01-01';
的解释计划所证明的那样 - 你会得到 filter(SYSDATE@!>=TO_DATE(' 2017-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
)
@Boneist:SQL 标准将日期文字定义为DATE 'YYYY-MM-DD'
。所以这个是一个日期。没有什么可以转换的。不要让引号使您感到困惑;该标准也可以将日期文字定义为§YYYYMMDD§
。 Oracle 目前如何在内部解析文字不应该是我们关心的问题,真的。
【参考方案1】:
您的to_date
s 中有多种格式,但没有定义它们。
create or replace procedure new_user as
begin
fnd_user_pkg.createuser('BOBBY',
'oracle123',
TO_DATE('7-FEB-2017', 'D-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN'), -- definition here, 'NLS_DATE_LANGUAGE=AMERICAN' can be omitted if your language is set to English
NULL,
TO_DATE('20-02-17','DD-MM-YY'), -- definition here
'80',
'78960',
'bobby@gmail.com');
end;
【讨论】:
请注意,格式掩码'D-MON-YYYY'
取决于 client 的 NLS 语言。为法语配置的客户端计算机失败
我同意 a_horse_with_no_name;在处理名称时,例如'FEB'
总是在 TO_DATE 的第三个参数中声明 NLS 日期语言:TO_DATE('7-FEB-2017', 'D-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN')
。
尝试此错误后,错误是:错误(3,162):PLS-00103:遇到符号“,”,当期望以下之一时:=。 ( % ; 错误 (3,194): PLS-00103: 遇到符号 ";" 当期望以下之一时: . ( ) , * % & = - + 在是 mod 余数不是 rem or != or ~= >= and or like2 like4 likec between || multiset member submultiset【参考方案2】:
这个错误可能是因为formatting of the to_date() function
这里有一个 fer 示例供参考:
to_date('29-Oct-09', 'DD-Mon-YY')
to_date('10/29/09', 'MM/DD/YY')
to_date('120109', 'MMDDYY')
to_date('29-Oct-09', 'DD-Mon-YY HH:MI:SS')
to_date('Oct/29/09', 'Mon/DD/YY HH:MI:SS')
to_date('October.29.2009', 'Month.DD.YYYY HH:MI:SS')
您也可以参考this link 以获取更多参考。
希望这会有所帮助!
【讨论】:
@Khushi 您正在进行的第二次转换可能有错误的顺序,尝试像 '20-2-17' , 'DD-Mon-YY' 试过了,但还是报错:ORA-01843: not a valid month 只是参考this link。这是格式掩码的一些小问题! 非常感谢 @Khushi 我的荣幸!以上是关于01847. 00000 - “日期必须介于 1 和最后一天之间”的主要内容,如果未能解决你的问题,请参考以下文章
hadoop中的SUCCESS和part-r-00000文件是啥