zoukankan      html  css  js  c++  java
  • 处理Oralce中非法的日期值

    Oracle中日期列对数据范围有要求,如年份要求为非0,小时要求为非负数,正常情况下,ORACLE是不允许这些数据插入到数据库中存储的。但是一些程序通过一些手段可以向数据库写入这个非法值,已发现的情况有用JAVA程序或Pb程序写入的,通过SQL日期运算也可以写入一些非法日期值。
    这些非法日期值一方面是有价值的(比如年月日是对的,只是小时为-1),另一方面,通过ADO.NET是无法直接读取的,甚至转化为字符串也不行,因为一在SQL中使用to_char,转化出来的值就是'0000-00-00'这样的值。
    可以使用dump对这些数据分析,如下例子:
    select startdate,dump(startdate) from sa.zland where substr(to_char(startdate,'yyyy-MM-dd'),1,4)='0000'
    1    1992-12-30    Typ=12 Len=7: 119,192,12,30,0,1,1
    2    1992-12-30    Typ=12 Len=7: 119,192,12,30,0,1,1
    3    1992-12-30    Typ=12 Len=7: 119,192,12,30,0,1,1
    4    1992-12-30    Typ=12 Len=7: 119,192,12,30,0,1,1
    5    1992-12-30    Typ=12 Len=7: 119,192,12,30,0,1,1
    6    1992-12-30    Typ=12 Len=7: 119,192,12,30,0,1,1

    而正常数据是:
    select startdate,dump(startdate) from sa.zland where substr(to_char(startdate,'yyyy-MM-dd'),1,4)<>'0000'
    1    1900-1-1    Typ=12 Len=7: 119,100,1,1,1,1,1
    2    1900-1-1    Typ=12 Len=7: 119,100,1,1,1,1,1
    3    1900-1-1    Typ=12 Len=7: 119,100,1,1,1,1,1
    4    1900-1-1    Typ=12 Len=7: 119,100,1,1,1,1,1
    5    1900-1-1    Typ=12 Len=7: 119,100,1,1,1,1,1
    6    1900-1-1    Typ=12 Len=7: 119,100,1,1,1,1,1

    ,发现这些数据中,小时字段中储存的数据是有问题的,全为0,按ORACLE的定义,即成了-1小时,因此做to_char转化全成了'0000-00-00'。
    做这个分析,可以发现异常日期数据中哪个字段出问题,然后对该字段进行修补即可。上例中,小时字段出问题,因此对小时字段修补:
    select startdate,dump(startdate+1/24) from sa.zland where substr(to_char(startdate,'yyyy-MM-dd'),1,4)='0000'
    全部日期加上1小时,让其为逻辑0点,在正常值范围内。
    之后通过to_char转换检查及ado.net读取测试,这些数据全部能正常转换及读取。

  • 相关阅读:
    安装GitLab出现ruby_block[supervise_redis_sleep] action run
    docker tag根据镜像id做标签,用于应用的回滚
    Jenkenis报错:该jenkins实例似乎已离线
    kubernetes-批量删除Evicted Pods
    阿里云k8s构建镜像时设置版本号用于版本回滚
    Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
    Java虚拟机5:Java垃圾回收(GC)机制详解
    Java虚拟机4:内存溢出
    Java虚拟机3:常用JVM命令参数
    Java虚拟机2:Java内存区域及对象
  • 原文地址:https://www.cnblogs.com/Render/p/1280103.html
Copyright © 2011-2022 走看看