본문 바로가기

배우기/복습노트[oracle sql]

[복습] SQL | Oracle 다양한 종류의 날짜 함수(sysdate, add_months, months_between, next_day, last_day, round/trunc)

728x90
반응형

현재 시스템 날짜 출력하는 함수는 sysdate 이다.

이러한 날짜는 연산이 가능하며, 정수를 더하고 빼면 일 단위로 연산이 된다.

두 날짜의 일 수를 리턴하고 싶다면, 말 그대로 두 날짜를 빼면 일 수가 출력된다.

 

 

 

만일 3개월 이전 날짜가 궁금하다고 하자.

월은 30일로, 31일로도 끝나기도 하며 어떨 땐 윤달이 끼어서 29 값을 활용해야 할 수도 있다.

이럴 때 add_months 사용하면 된다.

add_months(날짜, n) 의 형태로 사용되며 아래처럼 활용하면 된다.

3개월 이후는 양수, 이전은 음수로 나타내면 된다.

 

오늘 날짜로부터 3년 후를 표현해보면,

위와 같이 나타낼 수 있다.

그냥 365를 냅다 3으로 곱하면 예시처럼 하루가 모자라게 나타나므로 마지막 방법으로 계산하여야 할 것이다.

 

 

다음은 두 날짜의 사이의 개월 수를 구하는 방법이다.

months_between(날짜1, 날짜2)

날짜 1이 날짜 2보다 더 큰 날짜인 것이 특징이다.

이렇게 실습해본 결과 근속연수를 구하는 방법은 1의 방법이 아닌 2의 방법으로 해야한다.

날짜는 늘 윤달을 체크해야 할 것이다.

 

 

다음 PT는 다가오는 수요일에 합시다.

그럼 그 다가오는 수요일은 몇 일인지 계산하기 위한 함수는 바로 next_day 이다.

next_day(기준날짜, 요일)

기준날짜로부터 다가오는 요일이 몇 일인지 계산하는 것이다.

날짜의 언어가 영어인지 한국어인지에 따라(날짜를 표현하는 언어에 따라) 그에 맞게 전달한다.

여러 테스트를 해봤다.

일단 오늘 날짜로부터 test1을 도출한 결과 다가오는 월요일 날짜를 출력하였다.

test2는 월요일을 출력하니 다다음주가 나왔다.

그렇다면 test3처럼 넣으면, 다음주 월요일을 기준으로 다가오는 수요일이 출력되며,

test4는 다가오는 목요일을 기준으로 그 다음에 오는 수요일 날짜를 출력했다.

 

 

last_day(날짜)는 날짜가 포함된 달의 마지막 날짜를 리턴한다. 

예를 들어 10월 3일을 넣으면 31일을 출력, 2월 3일을 넣으면 윤달 여부에 따라 28일 또는 29일을 출력하는 것이다.

 

 

round/trunc은 숫자 함수에서 본 것인데, 이 함수는 날짜에도 적용이 된다.

숫자에서와 같이 round(대상, 단위) /  trunc(대상, 단위) 의 형태로 사용한다.

단위로는 year, month가 오나 day는 적용되지 않는다. 왜냐하면 자릿수를 생략하면 day로 맞추어지기 때문이다.

그런데 굳이 day를 쓴다? 이러면 오류는 없으나 엉뚱한 날이 리턴되므로 이는 주의하자.

정리하자면 ★ 일 단위로 맞추기 위한 시간단위에서의 반올림은 day를 생략해야 하며 trunc에서도 마찬가지이다.

 

 

연습문제를 풀어봅시다.

emp 테이블을 사용하여 각 직원의 이름, 사원번호, 연말보너스를 포함한 급여(sal)를 출력하되

연말 보너스는 근속연수*급여*0.01로 한다. 급여는 천 단위 구분기호와 함께 출력한다.

위는 내가 풀이한 방법이다.

선생님의 해설은 내가 푼 방법에서 trunc을 사용하지 않으셨다. trunc를 사용하지 않으면 일 단위도 나오게 되며 값이 조금 달라진다. 

이렇게 달라진다.

 

이렇게 따로 months_between을 꺼내어 써보니 소수점이 나온다. 이는 일 때문이라고 하셨다.

 

반응형

 

 

다음은 변환함수 차례..

변환함수는 그 양이 많은데 학원 문 닫을 때까지 다 못할 것 같아서 집에 가서 복습해야겠다.

728x90
반응형