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,因此您需要创建一个 基于函数的索引 。
我在 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,因此您需要创建一个 基于函数的索引 。