to_date(START_TIME,'YYYY-MM-DD HH24:MI:SS') >= to_date('2016-12-05 14:00:49','YYYY-MM-DD HH24:MI:SS')
一般出现此类问题是将日期型的字段中插入了字符型的数据,导致数据库不可识别而报错。
如:有如下test表
123create table test(id int,begin_date date);现在执行插入语句:
1insert into test values (1,'2015-01-01');则会报错:
如果正确插入,则要将字符型数据转成日期型数据:
1insert into test values (1,to_date('2015-01-01','yyyy-mm-dd'));to_char也是不行的
AND to_char(to_date(video.START_TIME, 'YYYY-MM-DD HH24:MI:SS'),
'YYYY-MM-DD HH24:MI:SS') >= '2016-12-05 14:07:19'
to_char(START_TIME,'YYYY-MM-DD HH24:MI:SS') >= to_char('2016-12-05 14:00:49','YYYY-MM-DD HH24:MI:SS')
追问如果你的start_time是date类型的,
直接用to_char(start_time,'yyyy-mm-dd hh24:mi:ss') >= '2016-12-05 14:00:49'再试一下
不对,start_time是varchar2类型。应该是start_time中有格式不规范的字段(有的日期前面有个空格,有的记录直接为空),但是这些格式不规范的字段要怎么处理呢?
追答那直接就可以用trim(start_time) >= '2016-12-05 14:00:49'
trim是消除前后空格的函数
恩恩,trim这个这么写没问题,现在最大的问题不是这个了,这里面有垃圾数据。。。。有的数据格式不是这样的。。。日,好坑
追答我看下面你的截图 这样的话你可以先对不符合的数据更新一下
update 表名 set start_time=to_char(to_date(start_time,'yyyy-mm-dd'));
然后再执行select 条件语句
有空的数据可以用条件 and start_time is not null 筛选出来
我把空的数据都做处理了,现在可以排除为空数据的影响了。但是现在这个sql:select to_date(start_time,'YYYY-MM-DD HH24:MI:SS') from T_ACCEPTED_WITNESSVIDEO
都还是报错
这说明你的start_time字段中还有其他不符合日期的值存在,我执行并没有这种错误
恩恩,是的,找到原因了,里面有一条不起眼的垃圾数据。谢了大婶
varchar2类型,那如果有不规范的值怎么办呢,比如说日期前面有的有个空格,有的记录是空的。
空格用trim函数,记录是空的应该不用管,反正都匹配不到记录
追问还有这样的数据怎么办。。。
感觉也不是这种问题,你看我的测试数据,及输出情况
这些情况好像的确没问题,那如果加上那种空的记录呢?
追答如果考虑空记录你干脆用nvl函数,把start_time 改为nvl(start_time,'2222-12-10')给他赋个不会关联到的值,这样就使空值变非空值去关联了
追问奇怪的是我用start_time = '' 是一条数据也查不出来的
追答用这个trim(start_time) is null 去除空格后这个值为空
追问这个sql还是不对,明明查出来的结果已经没有空的了,但是还是会报文字与格式字符串不匹配
是啊,我开始就说过为空最多就是匹配不到符合条件的数据,不会报这种错的,你还是从数值入手找找看,当然也可能不是时间这里的问题,也可能是其他关联字段的问题,当一个数字类型关联varchar类型的话,varcha中含有非数字字符串就会报这个错,包括参数的类型,你顺便也检查下其他用到的字段
追问恩,找到原因了。因为里面有一条不起眼的垃圾数据,唉~坑啊。感谢大婶
本回答被提问者和网友采纳START_TIME 是varchar2类型的