日期:2014-05-17  浏览次数:20807 次

求一个sql 语句 + 急急急 ???

计算工龄,精确到年月日。。。

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 要怎么写,才可以。非常的感谢了

------解决方案--------------------
用months_between,取日期间隔。
------解决方案--------------------
你的概念不清啊……

0.47是年,但是一年有12个月,所以你这个相当于0.47*12=5.64个月。。
另外,每个月份的天数不一样,几点几年或月无法正确表示天数……

而且就算你说的,0.65表示6个月5天,那我问你,6个月15天你怎么表示??
------解决方案--------------------
计算没问题,如果满一年了,结果后是大于1的
------解决方案--------------------
如果你要精确到,2年7月3天
还需要考虑闰年的
------解决方案--------------------
  我也看了 ,这个 每 年的 天数和月份 的天数 都是 不确定的 ,最好都 订成 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

看看 这个 样 写怎么样
------解决方案--------------------
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
 

自己参考着修改吧
------解决方案--------------------
引用:


那 你就 改成 

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


------解决方案--------------------
 不好啥意思 没有  这个 % 符号 
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') -