본문 바로가기
Database/Oracle

ORACLE SQL 날짜함수

by oncerun 2021. 11. 26.
반응형

날짜 함수

오라클에서는 쉽게 날짜를 관리할 수 있도록 여러 가지 함수를 제공합니다.

우리는 일반적으로 날짜에서 숫자를 빼기도 더하기도 날짜끼리 더하기도 빼기도 합니다.

오라클 또한 같은 원리로 날짜 계산을 합니다.

 

날짜 +- 날짜 = 날짜

날짜 +- 숫자 = 날짜

날짜 += 날짜 = 숫자

SYSDATE 

시스템의 현재 날짜와 시간을 알려줍니다.

오라클은 시간을 OS로부터 가져옵니다. 따라서 오라클 DB가 설치된 서버는 OS에서 시간을 함부로 바꾸면 안 됩니다.

CURRENT_DATE

세션 설정에 따른 시간입니다.

 

SYSTIMESTAMP

시스템의 현재 날짜와 시간 그리고 밀리세컨드까지 포함합니다.

 

CURRENT_TIMESTAMP

세션 설정에 따른 시간에 밀리세컨드까지 포함합니다.

 

하지만 출력 결과 연도와 월 일 까지만 출력됩니다.

우리는 설정을 변경함으로써 원하는 결과를 얻을 수 있습니다.

--ALTER SESSION SET TIME_ZONE ='-1.0';

그리니치 천문대를 기준으로 시간을 변경할 수 있다.
--ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

시간과 분 초를 설정할 수 있다.

 

 

날짜 추출 함수 EXTRACT(year/ month/ day / hour/ minute /second FROM SYSDATE) FROM DUAL;

SELECT 
EXTRACT(YEAR FROM SYSDATE),
EXTRACT(MONTH FROM SYSDATE),
EXTRACT(DAY FROM SYSDATE),
SYSDATE
FROM DUAL;

 

 

날짜를 누적하는 함수 ADD_MONTH(날짜 , 정수)

 

주어진 날짜에 정수만큼의 달을 추가하는 함수입니다.

SELECT SYSDATE , ADD_MONTHS(SYSDATE,3) FROM DUAL;

 

 

날짜의 차이를 알아내는 함수 MONTHS_BETWEEN(날짜, 날짜)

 

1. 작은 날짜를 먼저 쓰게 되면 음수가 나온다.

 

월을 28일, 29일, 30일, 31일로 다른 월수가 있으므로 그 결괏값은 각 각 다르게 출력된다.

 

2월이 28일까지 있는 달과 29일(윤일)까지 있는 달은 구분하지 못합니다.

 

SELECT TRUNC (MONTHS_BETWEEN(SYSDATE , TO_DATE('2014,2,1')),1) FROM DUAL;

74개월. 5일 차이가 난다

 

다음 요일을 알려주는 함수 NEXT_DAY(현재 날짜, 다음 요일)

주어진 날짜를 기준으로 돌아오는 가장 최근 요일의 날짜를 반환해줍니다.

특정 날짜 기준으로 돌아오는 요일의 날짜를 찾고 싶을 때 사용합니다.

현재시간은 4월 16일 목요일입니다.

 

월의 마지막 일자를 알려주는 함수 LAST_DAY(날짜)

 

주어진 날짜가 속한 달의 가장 마지막 날을 출력해주는 함수입니다.

보통 이벤트를 진행할 때 사용합니다. 이번 달까지~할인 매월 마지막 날이 다르기 때문에 할인 종료시간을 자동으로 입력합니다.

 

지정된 범위에서 날짜를 반올림하는 / 자르는 함수 ROUND/TRUNC(날짜, 포맷)

 

ROUND는 하루의 반에 해당되는 시간 12:00:00을 넘어선 경우 다음 날짜로 출력하고 이 전 시간이라면 당일을 출력합니다.

반면 날짜의 TRUNC함수는 무조건 당일로 출력합니다.

포맷에서 'CC'는 100년 단위로 반올림을 합니다.

 

YEAR, Q, MONTH, W, DAY, D, HH, MI 등 다양하게 반올림되거나 버려질 수 있습니다.

 

 

문자열 TO_DATE( 'string', format) 차이구하기

select to_date('1430', 'hh24mi') - todate('1330'. 'hh24mi') from dual;

 

다음과 같은 SELECT문의 결과 값을 우리는 1을 예상하지만 그 값은 다음과 같다.

오라클의 TO_DATE의 차이를 구한 결과 값은 일수 차이를 반환하기 때문이다.

 

이러한 일수 차이에서 시간 차이로 변환하기 위해서는 하루=24시간을 곱해주면 두 date객체의 시간 차이가 도출된다.

 

 

시간의 차이를 구한다는 부분에서는 문제가 하나 있는데 정확히 떨어지지 않는 경우에는 다음과 같이 소수점이 발생한다.

그렇기에 초 단위로 처리하지 않는 이상 안전한 시간 계산에는 분단위로 처리를 한다.

해당 쿼리에 * 60을 하면 시간 차이가 분단위로 나누어진다.

반응형

'Database > Oracle' 카테고리의 다른 글

[Oracle] Tablespace  (2) 2021.08.18
테이블 생성시 추가 속성  (0) 2021.08.04
테이블 및 칼럼 조회  (0) 2021.08.02
[Oracle] Cursor  (0) 2021.05.19
[ORACLE] PL/SQL  (0) 2021.05.16

댓글