繁体   English   中英

SQL ORA-01843 不是有效月份

[英]SQL ORA-01843 not a Valid month

SQL> select Users.name, Users.surname, Users.email from Users 2 inner join Login_History on Login_History.user_id=Users.user_id where 3 Login_History.entry_date=TO_DATE('01/12/2020','dd/mm/yyyy'); Login_History.entry_date=TO_DATE('01/12/2020','dd/mm/yyyy') ERROR at line 3: ORA-01843: not a valid month

在第 3 行,我想得到 where Login_History.entry_date=01/12/20的结果; 但是,它给出了无效的月份错误。

此代码在 SQL/Plus 中。

通过这种方式,我可以访问表格中的一些数据。

我建议将查询编写为:

select u.name, u.surname, u.email
from Users u join
     Login_History lh
     on lh.user_id = u.user_id
 where lh.entry_date = date '2020-12-01';

请注意表别名的使用以及如何定义日期常量。

以上假设entry_date实际上存储为date 如果不是,则应修复数据 model。 毕竟,日期应该存储为date s,而不是字符串。

如果它不是日期,而是格式为dd/mm/yyyy的字符串,那么您可以简单地进行相等比较:

where lh.entry_date = '01/12/2020'

这适用于相等性,但不适用于大多数范围——因为字符串是存储日期的错误方式。

如果entry_date列具有DATE数据类型,则您的查询有效; 因为它不起作用,所以我假设您没有使用DATE数据类型并且正在为列使用VARCHAR2数据类型。

最好的解决方案是修复表格并将日期存储为DATE而不是字符串:

ALTER TABLE login_history ADD ( entry_date2 DATE );
UPDATE login_history
SET entry_date2 = TO_DATE( entry_date, 'DD/MM/YYYY' );
ALTER TABLE login_history DROP PRIMARY KEY; -- Assuming it is part of the primary key.
ALTER TABLE login_history DROP COLUMN entry_date;
ALTER TABLE login_history RENAME COLUMN entry_date2 to entry_date;
ALTER TABLE login_history ADD
  CONSTRAINT login_history__pk PRIMARY KEY ( user_id, entry_date );

然后您的查询将无需任何更改即可工作。


或者,您可以使用TO_DATEentry_date从字符串显式转换为DATE

select Users.name,
       Users.surname,
       Users.email
from   Users
       inner join Login_History
       on ( Login_History.user_id=Users.user_id )
where  TO_DATE( Login_History.entry_date, 'dd/mm/yyyy' ) = DATE '2020-12-01';

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM