Sql ORA-01843:不是有效的月份错误
我在Oracle DB中有一个列,它是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中的
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'),我会收到相同的错误。