ORA-01843: 无效的月份

Posted

技术标签:

【中文标题】ORA-01843: 无效的月份【英文标题】:ORA-01843: not a valid month 【发布时间】:2012-10-28 10:02:40 【问题描述】:

我的 sql 查询有问题。

  create table rental
  (     
  rental_id NUMBER(5) NOT NULL,
  rental_date timestamp NOT NULL, 
  inventory_id NUMBER(5) NOT NULL,
  customer_id NUMBER(5) NOT NULL,
  return_date timestamp NOT NULL,
  staff_id NUMBER(5) NOT NULL,
  constraint rental_primary PRIMARY KEY (rental_id),
  constraint rental_foreign FOREIGN KEY (inventory_id) REFERENCES 

  inventory(inventory_id),
  constraint rental_foreign2 FOREIGN KEY (customer_id) REFERENCES
  customer(customer_id),
  constraint rental_foreign3 FOREIGN KEY (staff_id) REFERENCES staff(staff_id),
  constraint rental_unique_rental_date unique (rental_date),
  constraint rental_unique_inventory_id unique (inventory_id),
  constraint rental_unique_customer_id unique (customer_id),
  constraint rental_rental_date check(to_char(rental_date,'YYYY/MM/DD HH:MI:SS AM') 
  between '2005/01/01 00:00:01 AM' AND '12/31/2015 11:59:59 PM'),
  constraint rental_return_date check(to_char(return_date,'YYYY/MM/DD HH:MI:SS AM') 
  between '2005/01/01 00:00:01 AM' AND '12/31/2015 11:59:59 PM')
  );

当我尝试插入数据时, 它抛出此错误“ORA-01843: not a valid month”。 谁能建议我可以使用什么类型的数据类型来作为 rent_date 和 return date 来度过这种情况? 这是我正在尝试上传的示例数据

    rental_date                   return_date
   5/24/2011  10:53:30 PM        5/26/2011  10:04:30 PM

注意:我可以在我的 Excel 表中看到这种类型的格式,其中我有我的数据,但是当我收到错误时

       "ORA-01843: not a valid month    
     Row 145: 144,  2011-05-25 23:49:56  ,1689,357,  2011-06-01 21:41:56  ,2"

我在这里观察到不同的时间格式。

谁能给我建议一个解决方案?

提前致谢。

【问题讨论】:

参考此链接了解我如何使用时间戳数据类型techonthenet.com/oracle/functions/to_timestamp.php 你真的需要将这些字段声明为时间戳吗? 这里使用了两种不同的日期格式。另外,请考虑使用to_date 而不是to_char,这样您比较的是日期而不是字符串。 您是如何从电子表格中加载数据的? SQL*加载器?外部表?手动处理 PL/SQL?您是从实际电子表格(即 Excel 二进制文件)还是 CSV 文件加载? 【参考方案1】:

在您的检查约束中,您指定 TO_CHAR() 的日期格式掩码为 'YYYY/MM/DD HH:MI:SS AM'。但是您为范围指定的值有两种不同的格式,例如

'2005/01/01 00:00:01 AM' AND '12/31/2015 11:59:59 PM'

我认为使用日期代替是个好主意,因为字符串不会按照您认为的方式进行比较。

constraint rental_rental_date check(rental_date) 
    between to_date('2005/01/01 00:00:01 AM', 'YYYY/MM/DD HH:MI:SS AM') and
            to_date('2015/12/31 11:59:59 PM', 'YYYY/MM/DD HH:MI:SS AM')

但是,这可能不是您问题的根源。这可能是您加载过程中的转换,这就是为什么我们需要知道您是如何加载数据的。

【讨论】:

嗨。当我在 to_date('2005/01/01 00:00:01 AM', 'YYYY/MM/DD HH:MI:SS AM') 和 to_date('2015 /12/31 11:59:59 PM', 'YYYY/MM/DD HH:MI:SS AM') 我收到错误,ORA-00920: 无效的关系运算符 ...但我试过了这样, --> 约束rental_rental_date check(rental_date between to_date('2005/01/01 00:00:01 AM', 'YYYY/MM/DD HH:MI:SS AM') 和 to_date('2015/12 /31 11:59:59 PM', 'YYYY/MM/DD HH:MI:SS AM')) 我收到一个错误,ORA-01849:小时必须在 1 到 12 之间 我在创建表后使用 sql loader 上传这个数据文件。 你能建议我任何其他的解决方案吗?你能看我的数据并为我写一个查询来创建一个表吗?只需指定我需要用于租赁日期和归还日期的数据类型。并确保您指定两个日期应在 2005 年和 2015 年之间的条件 --------这是我的数据文件 link 尝试下载文件并查看存储日期的格式。谢谢。

以上是关于ORA-01843: 无效的月份的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01843 无效的月份

ORA-01843: 无效的月份 - 报告

oracle ORA-01843 无效的月份

错误代码[20001]; ORA-20001:ERROR-ORA-01843:无效月份

ORA-01843: 无效的月份 -java 到 sql 日期转换

ORA-01843: 无效的月份