Oracle PL/SQL Tutorial/Date Timestamp Functions/MONTHS BETWEEN

Материал из SQL эксперт
Перейти к: навигация, поиск

Months between birthday and now

SQL> create table emp
  2  ( empno      NUMBER(4)    constraint E_PK primary key
  3  , ename      VARCHAR2(8)
  4  , init       VARCHAR2(5)
  5  , job        VARCHAR2(8)
  6  , mgr        NUMBER(4)
  7  , bdate      DATE
  8  , sal       NUMBER(6,2)
  9  , comm       NUMBER(6,2)
 10  , deptno     NUMBER(2)    default 10
 11  ) ;
Table created.
SQL> insert into emp values(1,"Tom","N",   "Coder", 13,date "1965-12-17",  800 , NULL,  20);
1 row created.
SQL> insert into emp values(2,"Jack","JAM", "Tester",6,date "1961-02-20",  1600, 300,   30);
1 row created.
SQL> insert into emp values(3,"Wil","TF" ,  "Tester",6,date "1962-02-22",  1250, 500,   30);
1 row created.
SQL> insert into emp values(4,"Jane","JM",  "Designer", 9,date "1967-04-02",  2975, NULL,  20);
1 row created.
SQL> insert into emp values(5,"Mary","P",  "Tester",6,date "1956-09-28",  1250, 1400,  30);
1 row created.
SQL> insert into emp values(6,"Black","R",   "Designer", 9,date "1963-11-01",  2850, NULL,  30);
1 row created.
SQL> insert into emp values(7,"Chris","AB",  "Designer", 9,date "1965-06-09",  2450, NULL,  10);
1 row created.
SQL> insert into emp values(8,"Smart","SCJ", "Coder", 4,date "1959-11-26",  3000, NULL,  20);
1 row created.
SQL> insert into emp values(9,"Peter","CC",   "Designer",NULL,date "1952-11-17",  5000, NULL,  10);
1 row created.
SQL> insert into emp values(10,"Take","JJ", "Tester",6,date "1968-09-28",  1500, 0,     30);
1 row created.
SQL> insert into emp values(11,"Ana","AA",  "Coder", 8,date "1966-12-30",  1100, NULL,  20);
1 row created.
SQL> insert into emp values(12,"Jane","R",   "Manager",   6,date "1969-12-03",  800 , NULL,  30);
1 row created.
SQL> insert into emp values(13,"Fake","MG",   "Coder", 4,date "1959-02-13",  3000, NULL,  20);
1 row created.
SQL> insert into emp values(14,"Mike","TJA","Manager",   7,date "1962-01-23",  1300, NULL,  10);
1 row created.
SQL>
SQL> select ename
  2  ,      months_between(sysdate,bdate)
  3  from   emp
  4  where  deptno = 10;
ENAME    MONTHS_BETWEEN(SYSDATE,BDATE)
-------- -----------------------------
Chris                       532.561911
Peter                       683.303846
Mike                        573.110298
SQL>
SQL>
SQL> drop table emp;
Table dropped.


months_between current time and birthday

SQL>
SQL>
SQL> create table employees(
  2    empno      NUMBER(4)
  3  , ename      VARCHAR2(8)
  4  , init       VARCHAR2(5)
  5  , job        VARCHAR2(8)
  6  , mgr        NUMBER(4)
  7  , bdate      DATE
  8  , msal       NUMBER(6,2)
  9  , comm       NUMBER(6,2)
 10  , deptno     NUMBER(2) ) ;
Table created.
SQL>
SQL>
SQL> insert into employees values(1,"Jason",  "N",  "TRAINER", 2,   date "1965-12-18",  800 , NULL,  10);
1 row created.
SQL> insert into employees values(2,"Jerry",  "J",  "SALESREP",3,   date "1966-11-19",  1600, 300,   10);
1 row created.
SQL> insert into employees values(3,"Jord",   "T" , "SALESREP",4,   date "1967-10-21",  1700, 500,   20);
1 row created.
SQL> insert into employees values(4,"Mary",   "J",  "MANAGER", 5,   date "1968-09-22",  1800, NULL,  20);
1 row created.
SQL> insert into employees values(5,"Joe",    "P",  "SALESREP",6,   date "1969-08-23",  1900, 1400,  30);
1 row created.
SQL> insert into employees values(6,"Black",  "R",  "MANAGER", 7,   date "1970-07-24",  2000, NULL,  30);
1 row created.
SQL> insert into employees values(7,"Red",    "A",  "MANAGER", 8,   date "1971-06-25",  2100, NULL,  40);
1 row created.
SQL> insert into employees values(8,"White",  "S",  "TRAINER", 9,   date "1972-05-26",  2200, NULL,  40);
1 row created.
SQL> insert into employees values(9,"Yellow", "C",  "DIRECTOR",10,  date "1973-04-27",  2300, NULL,  20);
1 row created.
SQL> insert into employees values(10,"Pink",  "J",  "SALESREP",null,date "1974-03-28",  2400, 0,     30);
1 row created.
SQL>
SQL>
SQL> select ename
  2  ,      months_between(sysdate,bdate)
  3  from   employees;
ENAME    MONTHS_BETWEEN(SYSDATE,BDATE)
-------- -----------------------------
Jason                       511.218995
Jerry                       500.186737
Jord                        489.122221
Mary                        478.089963
Joe                         467.057705
Black                              456
Red                         444.993189
White                       433.960931
Yellow                      422.928673
Pink                        411.896415
10 rows selected.
SQL>
SQL> drop table employees;
Table dropped.


MONTHS_BETWEEN(x, y): get the number of months between x and y.

Returned result is a positive number of months
SQL> SELECT MONTHS_BETWEEN("25-MAY-2005", "15-JAN-2005") FROM dual;
MONTHS_BETWEEN("25-MAY-2005","15-JAN-2005")
-------------------------------------------
                                 4.32258065
SQL>


Returned result is a negative number of months

SQL>
SQL> SELECT MONTHS_BETWEEN("15-JAN-2005", "25-MAY-2005") FROM dual;
MONTHS_BETWEEN("15-JAN-2005","25-MAY-2005")
-------------------------------------------
                                 -4.3225806
SQL>


SELECT MONTHS_BETWEEN("15-JAN-2005", "25-MAY-2005")

2  FROM dual;
MONTHS_BETWEEN("15-JAN-2005","25-MAY-2005")
-------------------------------------------
                                 -4.3225806
SQL>
SQL>


Use the MONTHS_BETWEEN function

To find the time difference between two dates, use the MONTHS_BETWEEN function.

The MONTHS_BETWEEN function returns fractional months.

The general format of the function is: MONTHS_BETWEEN(date1, date2)

where the result will be date1 - date2.



SQL>
SQL> SELECT MONTHS_BETWEEN(TO_DATE("22SEP2006","ddMONyyyy"), TO_DATE("13OCT2001","ddMONyyyy")) "Months difference"
  2  FROM dual;
Months difference
-----------------
       59.2903226
SQL>