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_dates 中有多种格式,但没有定义它们。

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 和最后一天之间”的主要内容,如果未能解决你的问题,请参考以下文章

重做系统出现0xc00000ba怎么解决?

29283. 00000 - “无效的文件操作”

hadoop中的SUCCESS和part-r-00000文件是啥

0xc00000ba失败怎么办?

01735. 00000 - “无效的 ALTER TABLE 选项”

12703. 00000 - “不支持此字符集转换”