20. 날짜 연산 함수

날짜 관련 세션 설정 변경

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

 

날짜 연산의 기본 단위는 DAY(일수)

SELECT SYSDATE "COL1" -- 2022-02-22 09:44:04
, SYSDATE + 1 "COL2" -- 2022-02-23 09:44:04 → 하루 뒤
, SYSDATE - 2 "COL3" -- 2022-02-20 09:44:04 → 이틀 전
, SYSDATE - 30 "COL4" -- 2022-01-23 09:44:04 → 30일 전
FROM DUAL;

 

시간 단위 연산

SELECT SYSDATE "COL1" -- 2022-02-22 09:46:21
, SYSDATE + 1/24 "COL2" -- 2022-02-22 10:46:21 → 한 시간 뒤
, SYSDATE - 2/24 "COL3" -- 2022-02-22 07:46:21 → 두 시간 전
FROM DUAL;

 

현재 시간과 현재 시간 기준 1일 2시간 3분 4초 후를 조회하는 쿼리문을 구성해보면 다음과 같다.

방법 1.

SELECT SYSDATE "현재 시간"
     , SYSDATE + 1 + (2/24) + (3/(24*60)) + (4/(24*60*60)) "연산 후 시간"
FROM DUAL;
--==>> 2022-02-22 10:17:37
-- 2022-02-23 12:20:41

방법 2

SELECT SYSDATE "현재 시간"
     , SYSDATE + ((1*24*60*60) + (2*60*60) + (3*60) + 4) / (24*60*60) "연산 후 시간"
FROM DUAL;
--==>> 2022-02-22 10:19:20
-- 2022-02-23 12:22:24

 

날짜 - 날짜 = 일수

SELECT TO_DATE('2022-06-20', 'YYYY-MM-DD') - TO_DATE('2022-02-22', 'YYYY-MM-DD') "RESULT"
FROM DUAL;
--==>> 118

 

데이터 타입의 변환

SELECT TO_DATE('2022-06-20', 'YYYY-MM-DD') "RESULT"
  FROM DUAL;
--==>> 2022-06-20 00:00:00

SELECT TO_DATE('2022-06-35', 'YYYY-MM-DD') "RESULT"
  FROM DUAL;
--==>> 에러 발생
--     ORA-01847: day of month must be between 1 and last day of month

※ TO_DATE() 함수를 통해 문자 타입을 날짜 타입으로 변환을 수행하는 과정에 해당 날짜에 대한 유효성 검사가 이루어진다.

 

ADD_MONTHS()

  • 개월 수를 더해주는 함수
SELECT SYSDATE "COL1"
     , ADD_MONTHS(SYSDATE, 2) "COL2"
     , ADD_MONTHS(SYSDATE, -3) "COL3"
  FROM DUAL;
--==>>
/*
2022-02-22 10:30:04     → 현재
2022-04-22 10:30:04     → 2개월 후
2021-11-22 10:30:04     → 3개월 전
*/

 

MONTHS_BETWEEN()

  • 첫 번째 인자값에서 두 번째 인자값을 뺀 개월 수를 반환한다.
SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2002-05-31', 'YYYY-MM-DD')) "RESULT"
  FROM DUAL;
--==>> 236.723857526881720430107526881720430108

결과값의 부호가 『-』인 경우에는 첫 번째 인자값 날짜보다 두 번째 인자값 날짜가 『미래』임

 

NEXT_DAY()

SELECT NEXT_DAY(SYSDATE, '토') "COL1" -- 돌아오는 가장 빠른 토요일 구함
     , NEXT_DAY(SYSDATE, '월') "COL2"
FROM DUAL;
--==>> 2022-02-26 10:38:22
-- 2022-02-28 10:38:22

ALTER SESSION SET NLS_DATE_LANGUAGE = 'ENGLISH';    -- 영어로 변경

SELECT NEXT_DAY(SYSDATE, '토') "COL1"
FROM DUAL;
--==>> 에러 발생 (언어가 영어여서)
--     ORA-01846: not a valid day of the week

SELECT NEXT_DAY(SYSDATE, 'SAT') "COL1"
FROM DUAL;
--==>> 2022-02-26 10:38:22	

ALTER SESSION SET NLS_DATE_LANGUAGE = 'KOREAN';     -- 한국어로 변경

 

LAST_DAY()

  • 해당 날짜가 포함되어있는 그 달의 마지막 날을 반환한다.
SELECT LAST_DAY(SYSDATE) "COL1"
     , LAST_DAY(TO_DATE('2020-02-10', 'YYYY-MM-DD')) "COL2"
  FROM DUAL;
--==>>
/*
2022-02-28 10:44:54
2020-02-29 00:00:00
*/

 

 

참고로 세션 설정 변경

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';

※ 날짜 데이터를 대상으로 반올림, 절삭 등의 연산을 수행할 수 있다.

 

날짜 반올림

SELECT SYSDATE "COL1" -- 2022-02-22 → 기본 현재 날짜
     , ROUND(SYSDATE, 'YEAR') "COL2" -- 2022-01-01 → 년도까지 유효한 데이터(상반기/하반기 기준)
     , ROUND(SYSDATE, 'MONTH') "COL3" -- 2022-03-01 → 월까지 유효한 데이터 (15일 기준)
     , ROUND(SYSDATE, 'DD') "COL4" -- 2022-02-23 → 일까지 유효한 데이터 (정오 기준)
     , ROUND(SYSDATE, 'DAY') "COL5" -- 2022-02-20 → 일까지 유요한 데이터 (수요일 정오 기준)
  FROM DUAL;

 

날짜 절삭

SELECT SYSDATE "COL1" -- 2022-02-22 → 기본 현재 날짜
     , TRUNC(SYSDATE, 'YEAR') "COL2" -- 2022-01-01 → 년도까지 유효한 데이터
     , TRUNC(SYSDATE, 'MONTH') "COL3" -- 2022-02-01 → 월까지 유효한 데이터
     , TRUNC(SYSDATE, 'DD') "COL4" -- 2022-02-22 → 일까지 유효한 데이터
     , TRUNC(SYSDATE, 'DAY') "COL5" -- 2022-02-20 → 그 전 주에 해당하는 일요일
  FROM DUAL;

 

 

 

 

 

 

 

 

 


https://www.instagram.com/p/CaeEnIOrW6h/?utm_source=ig_web_copy_link

부족하거나 잘못된 내용이 있을 경우 댓글 달아주시면 감사하겠습니다.

이 글에 부족한 부분이 존재할 경우 추후에 수정될 수 있습니다.


 

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

22. CASE 구문(조건문, 분기문)  (0) 2022.03.12
21. 변환 함수  (0) 2022.03.12
19. 숫자 처리 함수  (0) 2022.03.12
SQL Developer theme(dracula) 적용  (0) 2022.03.11
18. LPAD(), LTRIM(), TRANSLATE(), REPLACE()  (0) 2022.03.11