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

Sql ORA-01843:不是有效的月份错误,sql,oracle,date,date-comparison,Sql,Oracle,Date,Date Comparison,我在Oracle DB中有一个列,它是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中的

我在Oracle DB中有一个列,它是
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')

尊重VARCHAR中的格式

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

如果表中的所有值都像
06/16/2015 02:14:18 AM
,那么您可以使用
trunc(截止日期(MYCOLUMN,'mm/dd/yyyyy HH:mi:SS PM'),'dd')
截止日期(substr(MYCOLUMN,1,10),'dd-mm-yyyyy')
如果表中的所有值都像
06/16/2015 02:14:18 AM
,那么您可以使用
trunc(截止日期)(MYCOLUMN,'mm/dd/yyyy HH:mi:SS PM'),'dd')
到目前为止(substr(MYCOLUMN,1,10),'dd-mm-yyyyy')

我在Oracle DB中有一列是varchar2数据类型。该列中存储的典型值类似于06/16/2015 02:14:18 AM

第一个问题是为什么将日期存储为字符串?使用适当的数据类型数据库设计性能的最重要部分之一

请理解日期没有格式您可以看到,它在内部存储为
7字节
,这是Oracle的专有格式。不建议将日期存储为字符串,以采用固定格式

我建议您首先修复设计,这样您就不必在比较日期时执行此开销活动。从长远来看,这将对您有所帮助

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

ALTER TABLE table_name ADD new_column DATE; UPDATE table_name SET new_column = TO_DATE(old_column, 'mm/dd/yyyy hh:mi:ss pm'); ALTER TABLE table_name DROP COLUMN old_column; ALTER TABLE table_name RENAME COLUMN old_name to new_name; 这也将在日期列上使用任何常规的索引

从性能角度看

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

我在Oracle DB中有一列是varchar2数据类型。该列中存储的典型值类似于06/16/2015 02:14:18 AM

第一个问题是为什么将日期存储为字符串?使用适当的数据类型数据库设计性能的最重要部分之一

请理解日期没有格式您可以看到,它在内部存储为
7字节
,这是Oracle的专有格式。不建议将日期存储为字符串,以采用固定格式

我建议您首先修复设计,这样您就不必在比较日期时执行此开销活动。从长远来看,这将对您有所帮助

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

ALTER TABLE table_name ADD new_column DATE; UPDATE table_name SET new_column = TO_DATE(old_column, 'mm/dd/yyyy hh:mi:ss pm'); ALTER TABLE table_name DROP COLUMN old_column; ALTER TABLE table_name RENAME COLUMN old_name to new_name; 这也将在日期列上使用任何常规的索引

从性能角度看


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

列中的格式:
06/16/2015 02:14:18 AM
与格式掩码
dd mm yyyyy>不匹配to_date()中使用的代码
调用该列。你想要
mm/dd/yyyy
而不是你的模式是错误的:''dd-mm-yyyy'`必须是
mm/'dd/yyyyy'
为什么要将
DATE
存储为
VARCHAR2
?使用适当的数据类型是数据库设计和性能最重要的部分之一。该列早就创建了。更改数据类型现在该列的pe将增加太多的其他开销。@user2488578现在更改该列的数据类型将增加太多的其他开销。相信我,迟早你会这样做。首先解决设计问题永远不会太迟。列中的格式:
06/16/2015 02:14:18 AM
与格式掩码不匹配
 您在日期()中使用的
调用该列。你想要
mm/dd/yyyy
而不是你的模式是错误的:''dd-mm-yyyy'`必须是
mm/'dd/yyyyy'
为什么要将
DATE
存储为
VARCHAR2
?使用适当的数据类型是数据库设计和性能最重要的部分之一。该列早就创建了。更改数据类型现在该列的pe将增加太多的其他开销。@user2488578现在更改该列的数据类型将增加太多的其他开销。相信我,迟早你会不得不这样做。首先解决设计问题永远不会太迟。谢谢。但是,如果我添加order by..
select*from MYTABLE where to,我会收到同样的错误_日期(substr(MYCOLUMN,1,10),'mm/dd/yyyyy')>到日期('08/01/2015','mm/dd/yyyyy')由其他列描述;谢谢。
但是,如果我添加order by.
从MYTABLE中选择*到日期('08/01/2015','mm/dd/yyyyy')>由其他列描述到日期('08/01/2015','mm/dd yyyyyy'),我会收到相同的错误。