日期:2014-05-16  浏览次数:20514 次

谁在挖坑

???? 有时候,总能碰上一些奇奇怪怪的问题,而这些问题大部分都是挖的“坑”,在项目里往往是一壑未平又现一坑……

???? 在接手别人开发的一个功能块之后,发现没有什么异常,程序跑的很好,就没去细看,有问题再说呗,谁愿意去看别人写的代码阿!是吧?

???? 不久问题就来了,系统换数据库(说老实话那点数据用什么数据库都不是问题,领导就喜欢用大的、强的,但到底多大多强,他才不管),由SQLServer换Oracle了,原来系统中的一个接口表(里面存放用户获得某服务的日期),其实系统中的很多接口表都这样设计的。接口嘛为了方便当年设计成使用varchar型来存日期,这样直接从友方传过来的文件存入表中,而对方使用的是Oracle,传过来的日期格式为“dd-MON-yyyy”,而当时系统中使用的日期格式是"yyyy-mm-dd" ,也不知道SQLServer中是否有直接转这两种类型的日期函数(感觉应该有,懒没去查),反正当年写那段存储过程的仁兄没用什么函数,而是使用substring在使用这个日期的时候先批量更新掉接口表里的日期为"yyyy-mm-dd",SQLServer里面数据类型的隐式转换使得拿这个字段当日期用一点问题都没有。

???? 现在换Oracle了,这个字段用Varchar2来保存数据,还是直接拿友方的数据存入,原来的数据记录也直接用ETL工具导了过来,没有一点问题,也就是说这个字段里存了'dd-mon-yyyy'和‘yyyy-mm-dd’两种类型的日期,对于老的数据,只是放在接口表里,不用管,当对方更新该信息的时候自动更新该字段变成了‘dd-mon-yyyy’,要使用的时候使用to_date(xxx,'dd-mon-yyyy','NLS_DATE_LANGUAGE=AMERICAN'),也没问题,窃窃自喜啊,少写一行代码也高兴的

??? 某日,有Boss放话了,要做统计,而且就是根据这个字段,本来说用Group BY应该没问题的,但是谁都知道'2008-5-13'跟‘13-may-2008’是同一天,没辙了,只能来更新啊,新老日期统一到'dd-mon-yyyy'上,怎么办?

??? 先用replace(xxx,'-','')这样'yyyy-mm-dd'的就变成'yyyymmdd'就变成number了,而'yyyyMONdd'就不是了,然后使用函数

??

create or replace function isNumber(p_in   varchar2)   return   INTEGER   as
          i   number;
  begin
          i:=to_number(p_in);
          return   1;
  exception
          when   others   then
                return   0;
  end   ;

?辅助判断isnumber(xxx)=1字段是否为number型,是的话更新该字段

xxx=to_char(to_date(xxx,'yyyymmdd'),'dd-MON-yyyy','NLS_DATE_LANGUAGE=AMERICAN')

?不是则

xxx=substr(xxx,1,2)||'-'||substr(xxx,3,3)||'-'||substr(xxx,6,4)

当然,这里要先更新非NUMBER的,不然就会因为'dd-MON-yyyy'不是数据类型而出错了

?

更新完之后统计就没有问题了,统计来吧^_^

????