两个日期之间的差异不考虑Oracle SQL中的年份

时间:2013-04-17 06:13:40

标签: sql oracle

我想询问两个日期之间的区别,而不考虑检查生日的年份。我找到查询来检查两个日期,并考虑一年。

例如,

   SELECT to_date(SYSDATE,'DD-MM-YYYY') - to_date(dateofbirth,'DD-MM-YYYY')
   FROM employees;

提前致谢..

2 个答案:

答案 0 :(得分:2)

一种简单的方法是使用DDD format model查看其年份中日期的序数:

to_number(to_char(sysdate, 'DDD')) - to_number(to_char(dateofbirth,  'DDD'))

CTE中有一些样本数据:

with t as (
    select 1 as id, date '1980-04-21' as dateofbirth from dual
    union all select 2 as id, date '1980-04-13' as dateofbirth from dual
    union all select 3 as id, dat
)
select id, dateofbirth, to_char(sysdate, 'DDD'), to_char(dateofbirth, 'DDD'),
    to_number(to_char(sysdate, 'DDD'))
        - to_number(to_char(dateofbirth,  'DDD')) as days
from t
order by id;

        ID DATEOFBIR TO_ TO_       DAYS
---------- --------- --- --- ----------
         1 21-APR-80 107 112         -5
         2 13-APR-80 107 104          3
         3 29-MAR-80 107 089         18

但正如Damien_The_Unbeliever在评论中指出的那样,你需要定义,或者至少理解并接受闰年会发生什么。这种方法没有做任何巧妙的事情,但对于你正在做的事情可能已经足够好了。

答案 1 :(得分:0)

你应该试试这个

SQL> SELECT (TO_DATE('20120525', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days
  2         ,TRUNC(MONTHS_BETWEEN(TO_DATE('20120525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD')))
  3         ,TRUNC(TRUNC(MONTHS_BETWEEN(TO_DATE('20120525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) / 12) num_years
  4         ,MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('20120525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))), 12) num_months
  5  FROM   dual
  6  /

将产生这个

DIFF_IN_DAYS TRUNC(MONTHS_BETWEEN(TO_DATE('  NUM_YEARS NUM_MONTHS
------------ ------------------------------ ---------- ----------
         875                             28          2          4

Source