Study📚/Oracle

Oracle - 날짜 다루기

woo!na 2023. 10. 29. 18:31

- 현재 날짜 및 시간

현재(시스템) 날짜. 데이터 형식은 날짜(DATE)형

SYSDATE, CURRENT_DATE, LOCALTIMESTAMP

SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP 
FROM DUAL; 
--==>> 2023-10-19 10:43:02 / 2023-10-19 10:43:02 / 23/10/19 10:43:02.000000000

 

- 날짜 크기비교

오라클에서는 날짜 데이터의 크기 비교가 가능하다. 날짜 데이터에 대한 크기 비교 시 과거보다 미래를 더 큰 값으로 간주한다.

ex) 오늘<내일 -> true

오늘>내일 -> false

 

- BETWEEN ⓐ AND ⓑ

ⓐ 이상 ⓑ 이하, 숫자 뿐만 아니라 날짜도 적용 가능

SELECT NAME"사원명", JOB"직종", HIREDATE"입사일" 
FROM TBL_EMP 
WHERE HIREDATE BETWEEN TO_DATE('1981-4-2','YYYY-MM-DD') 
                   AND TO_DATE('1981-9-28','YYYY-MM-DD');

 

- 날짜 연산

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

SELECT SYSDATE "COL1"       -- 2023-10-20 15:38:26 
    , SYSDATE + 1 "COL2"    -- 2023-10-21 15:38:26 
    , SYSDATE - 2 "COL3"    -- 2023-10-18 15:38:26 
    , SYSDATE + 30 "COL4"   -- 2023-11-19 15:38:26 
FROM DUAL;

 

- 시간 단위 연산 

SELECT SYSDATE "COL1"       -- 2023-10-20 15:41:37 
    , SYSDATE + 1/24 "COL2" -- 2023-10-20 16:41:37 
    , SYSDATE - 2/24 "COL3" -- 2023-10-20 13:41:37 
FROM DUAL;

 

- 날짜 - 날짜 → 일수 

SELECT TO_DATE('2024-03-19', 'YYYY-MM-DD') - TO_DATE('2023-08-22', 'YYYY-MM-DD') "COL1" 
FROM DUAL; 
--==>> 210

 

- TO_DATE()

날짜 타입으로의 데이터 타입 변환

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

즉, 13월 -> 에러발생, 32일 -> 에러발샹생

SELECT TO_DATE('2023-10-20', 'YYYY-MM-DD') "COL1" 
FROM DUAL; 
--==>>2023-10-20 00:00:00

 

- ADD_MONTHS()

개월 수를 더하거나 빼주는 함수 

SELECT SYSDATE "COL1" 
    , ADD_MONTHS(SYSDATE, 2) "COL2" 
    , ADD_MONTHS(SYSDATE, 3) "COL3" 
    , ADD_MONTHS(SYSDATE, -2) "COL4" 
    , ADD_MONTHS(SYSDATE, -3) "COL5" 
FROM DUAL; 
--==>> 2023-10-20 16:19:01  → 현재 
--     2023-12-20 16:19:01  → 2개월 후 
--     2024-01-20 16:19:01  → 3개월 후 
--     2023-08-20 16:19:01  → 2개월 전 
--     2023-07-20 16:19:01  → 3개월 전

 

- MONTHS_BTWEEN() 

첫 번째 인자값에서 두 번째 인자값을 뺀 개월 수를 반환한다.

개월 수의 차이를 반환하는 함수 결과값의 부호가 『-』(음수)로 반환되었을 경우에는 첫 번째 인자값에 해당하는 날짜보다 두 번째 인자값에 해당하는 날짜가 『미래』라는 의미로 확인할 수 있다. 

 

SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2002-05-31', 'YYYY-MM-DD')) "COL1" 
FROM DUAL; 
--==>> 256.667160991636798088410991636798088411

 

- NEXT_DAY()

첫 번째 인자값에서 가장 가까운 두 번째 인자값의 날짜를 반환한다.

SELECT NEXT_DAY(SYSDATE, '토') "COL1" 
    , NEXT_DAY(SYSDATE, '월') "COL2" 
FROM DUAL; 
--==>> 2023-10-21 16:25:02 
--     2023-10-23 16:25:02

 

LAST_DAY() 
해당 날짜가 포함되어 있는 그 달의 마지막 날을 반환한다. 

SELECT SYSDATE "COL1"                                       -- 2023-10-20 
    , LAST_DAY(SYSDATE) "COL2"                              -- 2023-10-31 
    , LAST_DAY(TO_DATE('2023-02-12', 'YYYY-MM-DD')) "COL3"  -- 2023-02-28 
    , LAST_DAY(TO_DATE('2020-02-12', 'YYYY-MM-DD')) "COL4"  -- 2020-02-29 
FROM DUAL;

 

- 날짜 데이터를 대상으로 반올림, 절삭

날짜 반올림

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

날짜 절삭

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