select sysdate - nvl(chgdt,depdt) as oltime from tabnamesysdate就是当前服务器时间。
nvl(field1,field2) 如果field1为空,则取field2的值,否则取field1的值。

解决方案 »

  1.   

    select decode(chgdt,'',查询日期-depdt,查询日期-depdt) oltime from tablename
      

  2.   

    我先试试,我的日期类型都是char的,不是date 的,估计要先加to_date转化
      

  3.   

    select nvl2(chgdt,查询日期-chgdt,查询日期-depdt) oltime from tablename
      

  4.   

    可以的,谢谢2位。
    如果要用oltime排序的话,似乎不可以
    要通过select嵌套,是吧?
      

  5.   

    对,就是用子查询:
    select * from 
    (
       select sysdate - nvl(chgdt,depdt) as oltime from tabname
    ) A order by oltime不过也可以这样写:
       select sysdate - nvl(chgdt,depdt) as oltime
         from tabname
        order by (sysdate - nvl(chgdt,depdt))
      

  6.   

    使用nvl和nvl2都可以,不过我还是有错误,
    ERROR:
    ORA-01841: (full) year must be between -4713 and +9999, and not be 0而我能够确定chgdt是没有空值的
    真怪了
      

  7.   

    select case when chgdt is not null then sysdate-to_date(chgdt,'YYYYMMDD')
    else sysdate-to_date(depdt,'YYYYMMDD') end as outline from table
      

  8.   

    ERROR:
    ORA-01841: (full) year must be between -4713 and +9999, and not be 0应该是to_date()出错了,检查的格式是否匹配
      

  9.   

    不用子查询可以直接排序:select nvl2(chgdt,查询日期-chgdt,查询日期-depdt) oltime from tablename order by oltime 
      

  10.   

    depdt格式都是合规范的,但chgdt部分前面有空格
    难怪会出错了
    数据又不能修改的。用decode倒可以解决,没有报错
      

  11.   

    可以用ltrim(chgdt) 去掉前面空格再to_date(ltrim(chgdt))
    to_date(ltrim(chgdt),fmt)
      

  12.   


    排序是不可以的,我忘记说了,对oltime还有最大最小值的限制的
      

  13.   

    在where后面不能用oltime,order by后面可以用oltime
      

  14.   

    这么一来,select实在太长了,看来还是用decode稍微少点
      

  15.   

    select 语句长短不是问题,最主要的是执行起来的效率,或者说即使效率不是最优,只要用户觉得速度可以就行。 decode 或者 nvl 都是oracle 自带的函数,用起来应该比较快吧?