본문 바로가기

데이터베이스(DB)/Oracle
[Oracle] 날짜 시간 함수

// 날짜 시간 함수, Date Time Function


// SYSDATE, CURRENT_DATE, SYSTIMESTAMP, CURRENT_TIMESTAMP : 현재 시간을 얻는 함수
    ~ SYS : 오라클 서버의 시간대
    ~ CURRENT :  세션 설정에 따른 시간대 
    ~ STAMP : 밀리세컨드까지

SELECT SYSDATE FROM DUAL; --23/02/17

SELECT CURRENT_DATE FROM DUAL; --23/02/17

SELECT SYSTIMESTAMP FROM DUAL; --23/02/17 08:57:02.331000000 +09:00

SELECT CURRENT_TIMESTAMP FROM DUAL; --23/17/08:58:02.00000000 ASIA_SEOUL

 

※세션 시간과 포맷 변경
ALTER SESSION SET TIME_ZONE = '-1:0'
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'


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

ALTER SESSION SET TIME_ZONE = '00:00'; --그리니치 기준 > 영국 시간으로 설정

// EXTRACT(YEAR/MONTH/DAY/HOUR/MINUTE/SECOND FROM ...) : 날짜 추출 함수

SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; --2023

SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL; --2

SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL; --18

- 가입 회원 중 비수기(2,3,11,12)월에 가입한 회원 조회

SELECT * FROM MEMBER WHERE EXTRACT (MONTH FROM REGDATE) IN(2,3,11,12);

// ADD_MONTHS(날짜, 정수) : 날짜 추출 함수

SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL; -- 2023-03-18- 23:36:59

SELECT ADD_MONTHS(SYSDATE, -1) FROM DUAL; -- 2023-01-18- 23:36:59

- 가입한 지 6개월이 안 되는 회원 조회

SELECT * FROM MEMBER WHERE ADD_MONTHS(SYSDATE, -6) < REGDATE;

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

SELECT NEXT_DAY(SYSDATE, '토요일') FROM DUAL; -- 2023-02-25 23:43:56

SELECT NEXT_DAY(SYSDATE, '토') FROM DUAL;

SELECT NEXT_DAY(SYSDATE, 7) FROM DUAL;

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

SELECT LAST_DAY(SYSDATE) FROM DUAL; -- 2023-02-28 23:45:22

SELECT LAST_DAY(ADD_MONTHS(SYSDATE, 1)) FROM DUAL; -- 2023-03-31 23:45:22

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

--세기
SELECT ROUND('2051-02-18', 'CC') FROM DUAL; -- 2101-01-01 00:00:00

SELECT ROUND(SYSDATE, 'YEAR') FROM DUAL; -- 2023-01-01 00:00:00

--분기
SELECT ROUND(SYSDATE, 'Q') FROM DUAL; -- 2023-04-01 00:00:00

SELECT ROUND(SYSDATE, 'MONTH') FROM DUAL; -- 2023-03-01 00:00:00

SELECT ROUND(SYSDATE, 'W') FROM DUAL; -- 2023-02-22 00:00:00

SELECT ROUND(SYSDATE, 'DAY') FROM DUAL; -- 2023-02-19 00:00:00

SELECT ROUND(SYSDATE, 'HH') FROM DUAL; -- 2023-02-19 00:00:00

SELECT ROUND(SYSDATE, 'MI') FROM DUAL; -- 2023-02-18 23:49:00



SELECT TRUNC('2051-02-18', 'CC') FROM DUAL;  -- 2001-01-01 00:00:00

SELECT TRUNC(SYSDATE, 'YEAR') FROM DUAL; -- 2023-01-01 00:00:00

// 날짜 연산

- 시각 - 시각
    1. 일, 시, 분, 초 > 연산자(-)
    2. 월, 년 > months_between(date, date)

select  
    name,
    ibsadate,
    round(sysdate - ibsadate) as "근무일수",
    round(months_between(sysdate, ibsadate)) as "근무월수",
    round(months_between(sysdate, ibsadate) / 12) as "근무년수",
    round((sysdate - ibsadate) * 24) as "근무시수",
    round((sysdate - ibsadate) * 24 * 60) as "근무분수",
    round((sysdate - ibsadate) * 24 * 60 * 60) as "근무초수"
from tblInsa;

select  
    name,
    ibsadate,
    sysdate - ibsadate as "근무일수",
    round(sysdate - ibsadate) as "근무일수 반올림"
from tblInsa;

select
    title,
    adddate,
    completedate,
    round((completedate - adddate) * 24, 1) as "걸린 시간"
from tblTodo
    where round((completedate - adddate) * 24, 1) <= 1;

select
    title,
    adddate,
    completedate,
    round((completedate - adddate) * 24, 1) as "걸린 시간"
from tblTodo
    order by round((completedate - adddate) * 24, 1) desc;

- 시각 +- 시간
1. 일, 시, 분, 초 > 연산자(+, -)
2. 월, 년 >  add_months(date, +|-)

select
    sysdate,
    sysdate + 100 as "100일 후",
    sysdate - 100 as "100일 전",
    sysdate + (3 / 24) as "3시간 후",
    sysdate - (5 / 24) as "5시간 전",
    sysdate + (30 / 60 / 24) as "30분 후"
from dual;

select 
    sysdate,
    sysdate + 10, --10일 뒤
    add_months(sysdate, 1), --한달 뒤
    add_months(sysdate, -3), --3개월 전
    add_months(sysdate, 3*12) --3년 뒤
from dual;

'데이터베이스(DB) > Oracle' 카테고리의 다른 글

[Oracle] NULL 관련 함수, DECODE 함수  (0) 2023.02.19
[Oracle] 변환 함수  (0) 2023.02.19
[Oracle] 숫자 함수  (0) 2023.02.17
[Oracle] 문자열 함수  (0) 2023.02.16
[Oracle] SELECT문  (0) 2023.02.14