最新最全 Oracle ORA-01861: 文字与格式字符串不匹配

接上篇,上一篇讲到,要将oracle表中已经存放的时间查询出来后再加8小时.然后再来使用所得到的结果.当时测试可行

但是第二天打开数据库再一执行,就会发现数据库报错,昨天可以完美执行的语句,今天就是一条报错的语句了.
TO_date(P.createdate,‘YYYY-MM-DD hh24:mi:ss’)+numtodsinterval(8,‘hour’)
在这里插入图片描述

What happened?
没办法,只能百度.最终找到一篇文章以解决此问题.
请往这里看:https://blog.youkuaiyun.com/qq_36798713/article/details/91044461
当然,我的情况与这篇作者的情况又有所不同.
原因很简单,前者是insert.而我是select.
我的表中存放时间的字段:createdate 数据类型为:DATE
TO_char(P.createdate,‘YYYY-MM-DD hh24:mi:ss’)+numtodsinterval(8,‘hour’)
此时会报错:ORA-30081: 对日期时间/间隔算法无效的数据类型
在这里插入图片描述

这样也不对,因为我如果直接将 P.createdate 做to_char处理的话,那么后面的操作就没有意义了.显然是一个很低级的错误.
继续修改语句:TO_char((P.createdate+numtodsinterval(8,‘hour’)),‘YYYY-MM-DD hh24:mi:ss’)
OK!查出结果了!

总结时刻.

这里倒叙分析问题
1.为什么 TO_char((P.createdate+numtodsinterval(8,‘hour’)),‘YYYY-MM-DD hh24:mi:ss’) 执行OK?
答,因为P.createdate本身即为 DATE 类型,所以第一次写的 TO_date(P.createdate,‘YYYY-MM-DD hh24:mi:ss’)+numtodsinterval(8,‘hour’)是不正确的,(这个地方也不能说是不正确,但是我自己目前还没搞明白,之所以说这个地方也是正确的原因继续浏览)
2.犯了很低级的错误 TO_char(P.createdate,‘YYYY-MM-DD hh24:mi:ss’)+numtodsinterval(8,‘hour’) 一个是char,一个是date怎么可能相加呢?(手动脸红)之所以写出来,也是为了提醒刚接触编程的朋友,基础一定要扎实!
3.在总结1中提到"TO_date(P.createdate,‘YYYY-MM-DD hh24:mi:ss’)+numtodsinterval(8,‘hour’)“也是正确的,也是错误的原因呢,其实是有一个前提条件的.
首先,在昨天第一次写出这条语句的时候,我这样写是可以查出来结果的.但是同样的语句,今天再执行就会报错.所以说这种写法既是对的,同时也是错的.
那么这个前提条件是什么呢?
不知道新手朋友对这条语句是否熟悉:
alter session set nls_date_format=‘YYYY/MM/DD HH24:MI:SS’;
这是修改oracle session的.作用是将时间格式修改为指定的日期格式:“YYYY/MM/DD HH24:MI:SS”,同时,我的oracle默认的日期格式是"14-10月-20”
而昨天,我执行"TO_date(P.createdate,‘YYYY-MM-DD hh24:mi:ss’)+numtodsinterval(8,‘hour’)"这种写法时,是因为在这之前.我修该了oracle的session.
但是今天再执行同样的语句之前我没有执行修改session的语句,所以昨天执行OK的语句今天就报错了.
这就是刚才提到的前提条件,但是至于为什么会这样,截止到文章发布,我还没有搞明白为什么.如果有知道原因的朋友还请不吝赐教.
如果我搞明白了原因,也会及时更新.
贴出来,对自己是笔记,对第一次遇到的朋友是帮助.
共同学习,共同进步吧!加油!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值