这个是scott 的四张表的操作练习以年月日的格式显示出所有员工的大概工作年限(如20年3个月2天)select ename,
       ni||yu||ti as time 
       from 
   (select ename,
        nian||'年' as ni ,
        yue-nian*12||'个月' as yu ,
        tian-yue*30||'天' as ti 
        from  
          (select ename,floor(sysdate-hiredate) as tian ,
                   floor((sysdate-hiredate)/365) as nian , 
                   floor((sysdate-hiredate)/30) as yue 
                   from 
                   emp));这个问题我只能按照一年365天一月30天计算吧  
 
就是说能不能带上闰年呀 ,闰月呀,  有的月31天 有的月30天呀什么的··

解决方案 »

  1.   


    SQL> select ename,
      2         numtoyminterval(months_between(sdt,hdt),'month') year_month,
      3         numtodsinterval(sdt-add_months(hdt,trunc(months_between(sdt,hdt))),'day') days_hours
      4  from
      5  (select ename,
      6         sysdate sdt,
      7         to_date(to_char(hiredate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') hdt
      8  from emp)
      9  /
     
    ENAME      YEAR_MONTH                              DAYS_HOURS
    ---------- --------------------------------------- ---------------------------------------
    SMITH      +000000030-05                           +000000026 19:06:28.000000000
    ALLEN      +000000030-03                           +000000023 19:06:28.000000000
    WARD       +000000030-03                           +000000021 19:06:28.000000000
    JONES      +000000030-02                           +000000010 19:06:28.000000000
    MARTIN     +000000029-08                           +000000015 19:06:28.000000000
    BLAKE      +000000030-01                           +000000011 19:06:28.000000000
    CLARK      +000000030-00                           +000000003 19:06:28.000000000
    SCOTT      +000000024-01                           +000000024 19:06:28.000000000
    KING       +000000029-06                           +000000026 19:06:28.000000000
    TURNER     +000000029-09                           +000000004 19:06:28.000000000
    ADAMS      +000000024-00                           +000000020 19:06:28.000000000
    JAMES      +000000029-06                           +000000009 19:06:28.000000000
    FORD       +000000029-06                           +000000009 19:06:28.000000000
    MILLER     +000000029-04                           +000000020 19:06:28.000000000
      --MILLER工作时长:29年4个月20天19个小时6分钟28秒
    14 rows selected
      

  2.   


    --你也可以使用substr函数截取你想要的数据
    SQL> select ename,substr(year_month,9,2)||'年'||
      2         substr(year_month,12,2)||'个月'||
      3         substr(days_hours,9,2)||'天'
      4  from (
      5  select ename,
      6         numtoyminterval(months_between(sysdate,hiredate),'month') year_month,
      7         numtodsinterval(sysdate-add_months(hiredate,trunc(months_between(sysdate,hiredate))),'day') days_hours
      8  from emp)
      9  /
     
    ENAME      SUBSTR(YEAR_MONTH,9,2)||'年'||
    ---------- ------------------------------
    SMITH      30年05个月26天
    ALLEN      30年03个月23天
    WARD       30年03个月21天
    JONES      30年02个月10天
    MARTIN     29年08个月15天
    BLAKE      30年01个月11天
    CLARK      30年00个月03天
    SCOTT      24年01个月24天
    KING       29年06个月26天
    TURNER     29年09个月04天
    ADAMS      24年00个月20天
    JAMES      29年06个月09天
    FORD       29年06个月09天
    MILLER     29年04个月20天
     
    14 rows selected
      

  3.   


    得出的结果比我得出的结果都要小上五个多月,  老早我就觉得我那答案有问题了,  
     我去研究研究那函数。  结贴了   爱死CSDN了  爱死大神们了··