计算工龄,精确到年月日select trunc((sysdate - HR_STARTWORKDATE)/365,2) from hr_filemanager where hr_filemanager_id=10000109工作开始日期为 2012-10-10 ,这样计算出来的为 0.47  如 0.47 如果直观的看的话,为4个月,零7天,而实际为6个月,(到当前日期 2013-4-1 )。我想要的是如果不满1年就算出他的月和日,如果不足1月就算出日,如果为1年以上就算出年月日。。 如果工作开始日期为2012-10-10 那么结果就应该为 0.6 表示工作时间为6个月,如果是工作了6个多月了,那么结果就应该是0.65 ,为6个月零5天这样的。而不是0.47。 我的上面的sql 对于计算 工作满1年以上的,可以非常的直观的看出来 如 2.73,为2年7月3天,但是如果工作不满一年的话。就像我上面的0.47 ,就个人错觉 为 4个月零7天。求高手,我的这一句sql 要怎么写,才可以。非常的感谢了

解决方案 »

  1.   

    回复 xinpingf  ,您说的是对的,我对这个概念模糊了,6月15天,确实不好表示,客户要的效果是想和,execl中的差不多,如 0年2个月,这样的,请问如果我如果不考虑平润年的话,天数按照30天来算,这个sql 要怎么写,假设考虑每个月的天数,那要怎么实现。???求 详细点
      

  2.   

      我也看了 ,这个 每 年的 天数和月份 的天数 都是 不确定的 ,最好都 订成 30 天吧, select trunc(to_number(dateTimes) / 365)  , trunc(to_number(dateTimes)/12),trunc(to_number(dateTimes)/30)
     from 
     (select round(to_number(TO_DATE(to_char(sysdate,'yyyy-mm-dd'), 'yyyy-mm-dd') - TO_DATE(to_char(HR_STARTWORKDATE,'yyyy-mm-dd'),'yyyy-mm-dd'))) as dateTimes
     from  hr_filemanager )  bs看看 这个 样 写怎么样
      

  3.   

    如果按照 fjmwish 7楼的朋友说的运行结果为上图的这样, 126 是月份??50 是天数?? 这样好像不对吧。
      

  4.   

    SELECT TRUNC (MONTHS_BETWEEN (SYSDATE + 400, SYSDATE) / 12) years,
           TRUNC (MOD (MONTHS_BETWEEN (SYSDATE + 400, SYSDATE), 12)) months,
           ROUND (MOD (MOD (MONTHS_BETWEEN (SYSDATE + 400, SYSDATE), 12), 1) * 30
                 ) days
      FROM DUAL
     自己参考着修改吧
      

  5.   

    11 的这位朋友给的sql 有点看不明白,400 是干什么的??
      

  6.   


    那 你就 改成 select trunc(to_number(dateTimes) / 365)  , trunc(to_number(dateTimes)%12),trunc(to_number(dateTimes)%30)
     from 
     (select round(to_number(TO_DATE(to_char(sysdate,'yyyy-mm-dd'), 'yyyy-mm-dd') - TO_DATE(to_char(HR_STARTWORKDATE,'yyyy-mm-dd'),'yyyy-mm-dd'))) as dateTimes
     from  hr_filemanager )  bs
      

  7.   

     不好啥意思 没有  这个 % 符号 
    select trunc(to_number(dateTimes) / 365),
           mod(to_number(dateTimes), 12),
           mod(to_number(dateTimes), 30)
      from (select round(to_number(TO_DATE(to_char(sysdate, 'yyyy-mm-dd'),
                                           'yyyy-mm-dd') -
                                   TO_DATE(to_char(HR_STARTWORKDATE,
                                                   'yyyy-mm-dd'),
                                           'yyyy-mm-dd'))) as dateTimes
              from hr_filemanager) bs
      

  8.   

    # 15 楼的兄弟 sql 语句真的学的很好,佩服佩服佩服佩服,是这样的,给分
      

  9.   

    怎么将这句sql
    select
    trunc(to_number(workdate)/365),mod(to_number(workdate),12), mod(to_number(workdate),30) 
    from(select round(to_number(TO_DATE(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') - TO_DATE(to_char(HR_STARTWORKDATE,'yyyy-mm-dd'),'yyyy-mm-dd'))) AS workdate from hr_filemanager)改为一句sql即不是上面的子查询。
      

  10.   

    我在 给你 发一个 select 
          trunc((to_number(round(to_number(TO_DATE(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') - TO_DATE(to_char(THIRD_UPDATETIME,'yyyy-mm-dd'),'yyyy-mm-dd')))))/365)
          ,
          trunc(MONTHS_BETWEEN(to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd'), TO_DATE('2013-02-10', 'yyyy-mm-dd')),0)
          ,
         mod(to_number(round(to_number(TO_DATE(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') - TO_DATE(to_char(THIRD_UPDATETIME,'yyyy-mm-dd'),'yyyy-mm-dd')))),30)
          
           from tab_third_party这个肯定行了 ,你再看看吧 
      

  11.   

    select trunc((to_number(round(to_number(TO_DATE(to_char(sysdate,
                                                            'yyyy-mm-dd'),
                                                    'yyyy-mm-dd') -
                                            TO_DATE(to_char(HR_STARTWORKDATE,
                                                            'yyyy-mm-dd'),
                                                    'yyyy-mm-dd'))))) / 365),
           mod(trunc(MONTHS_BETWEEN(to_date(to_char(sysdate, 'yyyy-mm-dd'),
                                            'yyyy-mm-dd'),
                                    to_date(to_char(HR_STARTWORKDATE,
                                                    'yyyy-mm-dd'),
                                            'yyyy-mm-dd')),
                     0),
               12),
           mod(to_number(round(to_number(TO_DATE(to_char(sysdate, 'yyyy-mm-dd'),
                                                 'yyyy-mm-dd') -
                                         TO_DATE(to_char(HR_STARTWORKDATE,
                                                         'yyyy-mm-dd'),
                                                 'yyyy-mm-dd')))),
               30)  from  hr_filemanager