我有一个varchar2字段,只包含日期(出于任何未知原因),但有些寄存器不是“to_date”格式化的。
我需要使用日期格式进行查询[例如: select * from users_table where status_date> '2014-01-21'],但出现消息“ORA-01861:文字与格式字符串不匹配”。
所以我想我可以使用以下代码更新日期格式的所有内容:
update users_table set status_date = to_date(status_date, 'dd-mm-yy') where status_date > '2014-01-21';
执行,但没有寄存器发生变化。请问,我该如何解决这个问题?
答案 0 :(得分:3)
如果status_date具有多种格式的日期字符串,则会再次抛出错误。
update users_table
set status_date = to_char(to_date(status_date, 'dd-mm-yy'),'YYYY-MM-DD')
where to_date(status_date ,'dd-mm-yy') > to_date('21-01-2014','DD-MM-YYYY');
答案 1 :(得分:1)
我不确定这会完成你最终想要的东西,这是为了避免表格中的不同日期格式。我会做的是像@DanBracuk建议的那样,使用“alter table”在日期类型的表中添加一个新列。
alter table users_table add (actual_status_date date);
然后更改您的查询以将to_date的结果放入新列(确保您的格式匹配@MaheswaranRavisankar建议)。我怀疑你的varchar日期表中可能有多种格式,'dd-mm-yy'格式字符串不匹配。所以这可能是手动和迭代的。继续选取其余的varchar格式,将日期类型放在新列中,直到没有空日期列。然后摆脱你的varchar日期列,永远不要再这样做了:)
如果在您的情况下适用,则可以向新数据列添加约束,例如非空约束。
alter table users_table modify actual_status_date date NOT NULL;
如果你这样做,请确保约束在你拥有的任何表创建脚本中结束。