ORA-01843: 不是有效的月份错误

ORA-01843: not a valid month error

我在 Oracle 数据库中有一列是 varchar2 数据类型。此列中存储的典型值类似于 06/16/2015 02:14:18 AM。 我正在尝试获取此列在 2015 年 8 月 1 日之后有记录的所有记录。

select * 
from MYTABLE 
where to_date(substr(MYCOLUMN,1,10),'dd-mm-yyyy') > to_date('01-08-2015','dd-mm-yyyy');

但是,我得到 ORA-01843。我哪里做错了?

尊重 VARCHAR 中的格式

....where to_date(substr(MYCOLUMN,1,10),'mm/dd/yyyy')

如果在你的 table 中所有值都像 06/16/2015 02:14:18 AM 那么你可以使用 trunc(to_date(MYCOLUMN,'mm/dd/yyyy HH:mi:SS PM'),'dd') 来对抗 to_date(substr(MYCOLUMN,1,10),'dd-mm-yyyy').

I have a column in Oracle DB which is varchar2 data type. Typical value stored in this column is like 06/16/2015 02:14:18 AM.

第一个问题是为什么要将 DATE 存储为 string?使用合适的数据类型数据库设计性能.[=18最重要的部分之一=]

了解 DATE 没有您看到的 格式 ,它内部存储在 7 bytes 中,这是 Oracle 的专有格式。不建议将日期存储为 字符串 以具有固定格式。

我建议首先修复设计,这样您就不必在 比较日期 时进行此开销 activity。在更长的运行它会帮助你。

1.添加一个新列作为 DATE 数据类型。

ALTER TABLE table_name 
   ADD new_column DATE;

2。更新新列。

UPDATE table_name 
   SET new_column = TO_DATE(old_column, 'mm/dd/yyyy hh:mi:ss pm');

3。删除旧列。

ALTER TABLE table_name 
   DROP COLUMN old_column;

4。将新列重命名为旧列名称。

ALTER TABLE table_name
  RENAME COLUMN old_name to new_name;

现在,您可以轻松比较日期:

SELECT * FROM MYTABLE WHERE mycolumn > to_date('01-08-2015','dd-mm-yyyy');

这还将在日期列上使用任何常规 索引

从性能的角度:

如果您现在不修复它,您将继续面临性能问题。由于 SUBSTR 的即时修复不会让您使用任何常规 index,因此您需要创建一个 基于函数的索引