zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    flutter 屏幕宽高 状态栏高度
    flutter 图片圆角
    flutter ListView嵌套高度问题
    Dubbo原码解析(version:2.5.3)
    ms
    InnoDB锁问题 & DB事务隔离级别
    Spring父容器与子容器
    Spring bean 的加载过程和生命周期
    logback
    Disconf (version : 2.6.21)
  • 原文地址:https://www.cnblogs.com/PiscesCanon/p/14552902.html
Copyright © 2011-2022 走看看