데이터베이스/Oracle SQL

오라클 SQL과 PL/SQL ( 날짜 관련 함수 )

동띠기 2021. 7. 14. 00:01

날짜관련 함수들

우리가 평소 일상생활에서 날짜를 사용하는 경우
7월 20일 + 3은 7월 23일로 생각한다,
7월 20일 - 3은 7월 17일로 생각한다.
7월 20일 - 7월 15일은 5일 차이가 난다고 생각한다.

위 세가지 경우에서 알 수 이듯이 일반적으로 날짜 + 숫자 = 날짜로 인식하고, 날짜 - 숫자 = 날짜로 인식한다.
그리고 날짜 - 날짜 = 숫자로 인식 합니다.

SYSDATE : 시스템의 현재 날짜와 시간  / 결과 : 날짜
MONTHS_BETWEEN :  두 날짜 사이의 개월 수 / 결과 : 숫자
ADD_MONTHS : 주어진 날짜에 개월을 더함 / 결과 : 날짜
NEXT_DAY : 주어진 날짜를 기준으로 돌아오는 날짜를 출력 / 결과 : 날짜
LAST_DAY : 주어진 날짜가 속한 달의 마지막 날짜 출력 / 결과 : 날짜
ROUND : 주어진 날짜를 반올림 / 결과 : 날짜
TRUNC : 주어진 날짜를 버림 / 결과 : 날짜


SYSDATE : 시스템의 현재 날짜와 시간
현재 시스템의 시간을 출력해주는 함수. 이 시스템이란 OS로 부터 시간을 가져 옵니다. 
그래서 오라클DB가 설치된 서버는 절대로 OS에서 시간을 함부로 바꾸면 안된다.
위도우와 리눅스의 오클 날짜 체계가 다르다.
리눅스 : 13-JULY-21 이런식으로 출력이 된다.


MONTHS_BETWEEN :  두 날짜 사이의 개월 수
이렇게 두 날짜 사이의 개월 수가 나온다.
주의점은 큰 날짜를 먼저 써야 양수가 나온다, 작은 날짜를 먼저쓰면 음수로 출력이 된다.
두 날짜가 같은 달에 속해 있으면 특정 규칙으로 계산된 값이 나온다.
동일하게 1개월 이지만 출력되는 값은 다르다. 큰 문제는 아닐 수 있지만 문제가 발생할 수 있으니 주의 하자.
그리고 28일까지 있는 달과 29일(윤일)까지 있는 달은 구분하지 못한다.
윤일이 있는 달을 계산하지 못하는 경우는 특히 돈과 관련된 부분에서 큰 문제가 발생할 수 있는데, 이자를 계산한다고 하면 1000억을 빌렸을 때 하루이자가 어마어마 한데 이런 부분을 계산할 때 특히 조심을 해야합니다.
일반적으로 MONTHS_BETWEEN 함수를 안쓰고 그냥 개월 수나 일 수를 계산하는 때 1개월을 약 31일로 계산하기도 하고 MONTHS_BETWEEN도 1개월 평균 31일 계산한다고 알려져 있습니다. 하지만 MONTHS_BETWEEN 함수를 쓴 것과 그냥 31일로 계산한 결과는 차이가 납니다.
아래에서 보다 싶이 결과가 상당히 차이가 나는데 그럼으로 더더욱 조심해서 사용해야 한다.

같은 달에 있어 특정한 규칙으로 계산된 값 출력
31일 계산의 차이


ADD_MONTHS : 주어진 날짜에 개월을 더함



NEXT_DAY : 주어진 날짜를 기준으로 돌아오는 날짜를 출력


특정 날짜를 기준으로 돌아오는 요일의 날짜를 찾고싶으면 이와 같이 하면 된다.


LAST_DAY : 주어진 날짜가 속한 달의 마지막 날짜 출력

LAST_DAY함수는 생각보다 많이 사용하게 된다. 주로 이번 달 까지 할인 % 적용 이라던지 이벤트 같은 것을 진행할때 사용합니다.
매달 마지막 날이 다를 수 있기에 종료 시간에 날짜를 직접 입력하면 나중에 SQL을 일일이 변경해야 하는 번거로움이 있기 떄문에 LAST_DAY를 사용합니다.


ROUND : 주어진 날짜를 반올림 / TRUNC : 주어진 날짜를 버림

날짜의 ROUND는 하루의 반에 해당하는 시간 즉 낮(정오) 12:00:00 인데, 주어진 날짜가 이 시간을 넘어설 경우에는 다음날짜로 출력하고 이 시간이 안 될 경우에는 당일로 출력합니다.

반면 TRUNC함수는 무조건 당일로 출력합니다.
이 기능은 주로 원서 접수나 상품 주문 등에서 오전까지 접수된 건은 당일 접수 처리하고 오후에 접수된 건은 이튿날로 처리할 떄 접수 날짜를 ROUND 함수로 처리하면 되고 접수 시간에 상관없이 당일로 처리하는 경우 TRUNC함수로 처리하여 사용할 수 있습니다.

 

728x90