oracle sql 去年,Oracle中如何构造一条在去年运行不报错今年运行报错的SQL语句

Oracle中如何构造一条在去年运行不报错今年运行报错的SQL语句

事情的起因是业务人员找我帮忙查看一条SQL语句运行报错ORA-01839: date not valid for month specified。

大致的SQL语句为,其中date_dt是varchar2(10):

select to_char(to_date(t.date_dt, ‘yyyy-mm-dd‘), ‘yyyymmdd‘) as date_dt from date_temp t;

语句运行到某个地方就报错了。

a56b0a5445cff1bb8aea11a3c8724e34.png

只能跑出1515条数据,之后就开始报错。

特地全表扫描出来第1616条为‘2021-02-24‘,一开始还以为这一条是有乱码或者是不可见的字符,结果做16进制dump发现没问题。。

2c4cd018c96186a3af537cbf1dd6fc15.png

纳闷了,知道是日期转换出问题,肯定是有数据有问题,但是查看全部的数据,肉眼大致看了下都没有出现明显的格式有问题的数据。

后来仔细想想,有可能是出现平年然后是2月29日这一天。

一查,果然是这样。

060f62ed946f6b74985a01d09ab489f0.png

根本就没有‘2021-02-29‘这一天,处理好这条数据就不在报错了。

这里突然想到,如果to_date(‘01-01‘,‘mm-dd‘)类似这样不显示年份的写法,最后其实Oracle自动附加上当前OS时间所在的年份。

SQL> select to_date(‘01-01‘,‘mm-dd‘) fromdual;

TO_DATE(‘01-01‘,‘MM

-------------------

2021-01-01 00:00:00

那么,想构造一条在去年运行不报错今年运行报错的SQL语句很简单就写出来了。

select to_date(‘02-29‘,‘mm-dd‘) fromdual;

这条SQL在闰年运行不报错,平年运行就报错了。

参考

TO_DATE() RETURNS CURRENT MONTH WHEN NO MONTH DATA FOUND IN ARGUMENT (文档 ID 1014079.6)

原文:https://www.cnblogs.com/PiscesCanon/p/14552902.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值