Data Base_Oracle/SQL

SQL 단일행 함수_날짜함수

pathas 2020. 1. 2. 23:32

날짜함수

함수 설명
months_between() 날짜 사이의 개월수를 반환하는 함수,
months_between(A, B) : A날짜에서 B날짜를 빼서 계산
add_months() 특정 날짜에 지정한 개월수를 더한 날짜를 반환하는 함수,
add_months(날짜, 개월수)
next_day() 지정한 날짜 이후에 해당 요일이 오는 날짜를 반환하는 함수
next_day(지정한 날짜, '요일'),
요일은 숫자로도 사용 가능 : 일요일 - 1, 월요일 - 2,화요일 - 3,,,,,금요일 - 6,토요일 - 7
last_day() 지정한 날짜가 포함되어 있는 달의 마지막 날짜를 반환하는 함수,
윤년, 평년을 자동으로 계산
sysdate 현재 날짜를 반환하는 함수

날짜함수 사용례

{ months_between() }

▷ emp테이블에서 각 사원들의 근무 개월수 계산(오늘날짜 - 입사일)
사원명, 입사일, 근무 개월수 순으로 출력
부서번호는 10번
근무 개월수가 가장 많은 순으로 정렬
▶ [ SQL > select ename, hiredate, months_between(sysdate, hiredate) 근무개월수
2 from emp
3 where deptno=10
4 order by 3 desc ]

ENAME HIREDATE 근무개월수
CLAKR 81/06/09 462.793551
KING 81/11/17 452.535486
MILLER 82/01/23 455.341938

※ 소수점은 round(), trunc(), floor() 등의 함수로 중첩함으로써 처리할 수 있음

{ add_months() }

▷ emp테이블에서 입사일기준 10개월 후의 날짜를 계산(단, sal이 2000이상인 사원들만 출력),
필드 순서는 이름, 급여, 10개월후의 날짜

▶ [ SQL> select ename, sal, add_months(hiredate, 10) "10개월 후" from emp where sal>=2000; ]

ENAME SAL 10개월 후
JONES 2975 82/02/02
BLAKE 2859 82/03/01
CLARK 2450 82/04/09
... ... ...

{ next_day() }

▷ emp테이블에서 사원들이 입사한 날짜의 요일 구하기

▶ [ SQL> select deptno, ename, hiredate, next_day(hiredate, '목요일') from emp; ]
    → 목요일인 날짜에서부터 고용일의 요일을 계산하면 됨

DEPTNO ENAME HIREDATE NEXT_DAY(HIREDATE, '목요일')
20 SMITH 80/12/17 80/12/18
30 ALLEN 81/02/20 81/02/26
... ... ... ...

※ next_day()안의 '목요일'은 5로도 대체 가능

{ last_day() }

▷ dual테이블에서 오늘 날짜가 속한 달의 마지막 날짜를 계산

▶ [ SQL> select last_day(sysdate) from dual; ]

LAST_DAY
20/01/31

▷ emp테이블에서 입사한 달의 근무일수를 계산,
   이름의 두번째 글자가 'A'인 직원 중에서 근무일수가 많은 순으로 정렬

▶ [ SQL> select ename, hiredate, last_day(hiredate)-hiredate "입사한 달의 근무일"
from emp where ename like '_A%'
order by 3 desc; ]

ENAME HIREDATE 입사한 달의 근무일
JAMES 81/12/03 28
WARD 81/02/22 6
MARTIN 81/09/28 2

날짜를 이용한 계산은 수식으로 하기 어렵기 때문에 날짜함수를 이용하는 편이 좋습니다.