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;
语句运行到某个地方就报错了。
只能跑出1515条数据,之后就开始报错。
特地全表扫描出来第1616条为'2021-02-24',一开始还以为这一条是有乱码或者是不可见的字符,结果做16进制dump发现没问题。。
纳闷了,知道是日期转换出问题,肯定是有数据有问题,但是查看全部的数据,肉眼大致看了下都没有出现明显的格式有问题的数据。
后来仔细想想,有可能是出现平年然后是2月29日这一天。
一查,果然是这样。
根本就没有'2021-02-29'这一天,处理好这条数据就不在报错了。
这里突然想到,如果to_date('01-01','mm-dd')类似这样不显示年份的写法,最后其实Oracle自动附加上当前OS时间所在的年份。
SQL> select to_date('01-01','mm-dd') from dual; TO_DATE('01-01','MM ------------------- 2021-01-01 00:00:00
那么,想构造一条在去年运行不报错今年运行报错的SQL语句很简单就写出来了。
select to_date('02-29','mm-dd') from dual;
这条SQL在闰年运行不报错,平年运行就报错了。
参考
TO_DATE() RETURNS CURRENT MONTH WHEN NO MONTH DATA FOUND IN ARGUMENT (文档 ID 1014079.6)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?