oracle定义日期列datetime,c# 访问 ORACLE 时 年、月和日参数描述无法表示的 DateTime 急急急 跪求...

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读取测试,这些数据全部能正常转换及读取。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值