数据库中的类型是varchar2的,其实存储的是8位日期。如20010910 表示2001年9月10日
但现在有很多数据是不规则的2007.8.5,2007.10.5,2007.9.2,2007.4 要转换为8位日期字符串
需要将上面的转换为20070805,20071005,20070902,20070400
这条sql应该如何写。

解决方案 »

  1.   

    只要规则统一:年份、月份、日子,就好办:如:YYYY-MM-DD、YYYY.MM.DD、YYYYMMDD、YYYY/MM/DD可以统一为: replace(replace(replace(your_date_column,'.',''),'-',''),'/','')
      

  2.   

    你这个格式都不一致,统一起来比较麻烦,最好还是先将所有字段中含有“.”的去掉,然后转换成date型,最后再转回varchar2类型
      

  3.   

    SQL> select to_char(to_date('2007.8.5','yyyy-mm-dd'),'yyyymmdd') from dual;
     
    TO_CHAR(TO_DATE('2007.8.5','YY
    ------------------------------
    20070805
     
    SQL> 
      

  4.   

    update table a set a.col=to_char(to_date(a.col,'yyyy-mm-dd'),'yyyymmdd')
    where a.col like '%.%'
      

  5.   

    是哦,那就分成几种情况.
    update table a set a.col=to_char(to_date(a.col,'yyyy-mm-dd'),'yyyymmdd')
    where translate(a.col,'.'||a.col,'.')='..';
    update table a set a.col=to_char(to_date(a.col,'yyyy-mm'),'yyyymmdd')
    where translate(a.col,'.'||a.col,'.')='.';
      

  6.   

    或者分解字串然后使用lpad补足位数,然后再wm_concat组合起来也可以,就是逻辑复杂,效率也是问题.
      

  7.   


    SQL> with tb as
      2  (select '2007.8.5' dt from dual union all
      3  select '2007.10.5' dt from dual union all
      4  select '2007.9.2' dt from dual union all
      5  select '2007.4' from dual 
      6  )
      7  select case when 
      8  instr(dt,'.',1,2)=0 then to_char(to_date(dt,'yyyy.mm'),'yyyymm')||'00'
      9  else to_char(to_date(dt,'yyyy.mm.dd'),'yyyymmdd') end 
     10  from tb
     11  /CASEWHEN
    --------
    20070805
    20071005
    20070902
    20070400
      

  8.   


    with tb as 
    (
         select '2007.8.4' td from dual union all
         select '2007.8/04' td from dual union all
         select '2008-10.5' from dual  union all
         select '2009/5' from dual union all
         select '2009.12' from dual
    )select 
    case when len(td)>=8 then to_char(to_date(td,'yyyy-mm-dd'),'yyyymmdd')
    else to_char(to_date(td,'yyyy-mm'),'yyyymm')||'00' end td from tb        TD
    1 20070804
    2 20070804
    3 20081005
    4 20090500
    5 20091200