언어/SQL

시간/날짜 함수 (오라클)

asu2880 2022. 6. 13. 16:56

SYSDATE

현재 일자 / 시간 출력
최소단위 = 1초

SELECT SYSDATE FROM DUAL;
-- 19/06/07 (DATE TYPE)

SELECT TO_CHAR(SYSDATE) FROM DUAL;
-- 19/06/07 (CHAR TYPE)

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;
-- 2019-06-07 (CHAR TYPE)

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
-- 2019-06-07 13:21:59 (CHAR TYPE)
-- SYSDTE 예제
SELECT TO_CHAR(SYSDATE,'RRRR-MM-DD HH24:MI:SS') "지금시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-1,'RRRR-MM-DD HH24:MI:SS') "하루전지금시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-1/24,'RRRR-MM-DD HH24:MI:SS') "1시간전시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-1/24/60,'RRRR-MM-DD HH24:MI:SS') "1분전시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-1/24/60/10,'RRRR-MM-DD HH24:MI:SS') "6초전시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-(5/24 + 30/24/60 + 10/24/60/60),'RRRR-MM-DD HH24:MI:SS') "5시간 30분 10초전"
  FROM DUAL ;

 

💊 CHAR 또는 VARCHAR2 TYPE을 DATE TYPE으로 변환

SELECT TO_DATE('2019-06-07'), 
	   TO_DATE('20190607'), 
       TO_DATE('2019 06 07'), 
       TO_DATE('2019/06/07') 
FROM DUAL;
-- 19/06/07 (DATA TYPE)
SELECT TO_DATE('19-06-07'), 
	   TO_DATE('19 06 07'), 
       TO_DATE('19/06/07') 
FROM DUAL;
-- 19/06/07 (DATA TYPE)
SELECT TO_DATE('2019-06-07 12:05:06', 'YYYY-MM-DD HH24:MI:SS')
FROM DUAL;
-- 19/06/07 12:05:06 (DATA TYPE)
SELECT TO_DATE('190607')
FROM DUAL;
-- literal does not match format string
SELECT TO_DATE('190607', 'YYMMDD')
FROM DUAL;
-- 19/06/07 (DATA TYPE)

 

💊 년, 월, 시, 분, 초 가져오기

SELECT TO_CHAR(SYSDATE, 'YYYY'), TO_CHAR(SYSDATE, 'MM'), TO_CHAR(SYSDATE, 'DD'),
	   TO_CHAR(SYSDATE, 'HH24'), TO_CHAR(SYSDATE, 'MI'), TO_CHAR(SYSDATE, 'SS')
FROM DUAL;
-- Result(2019/06/07 15:43:29) : 2019 06 07 15 43 29
SELECT EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE), EXTRACT(DAY FROM SYSDATE),
	   EXTRACT(HOUR FROM CAST(SYSDATE AS TIMESTAMP)),
	   EXTRACT(MINUTE FROM CAST(SYSDATE AS TIMESTAMP)),       
	   EXTRACT(SECOND FROM CAST(SYSDATE AS TIMESTAMP)),              
FROM DUAL;
-- Result(2019/06/07 15:43:29) : 2019 6 7 15 43 29
SELECT EXTRACT(HOUR FROM SYSDATE), EXTRACT(MINUTE FROMM SYSDATE), EXTRACT(SECOND FROM SYSDATE)
FROM DUAL;
-- Error : invaild extract field for extract source

 

💊 어제, 오늘, 내일, 전달, 다음달, 전년, 내년

SELECT SYSDATE -1 YESTERDAY, SYSDATE TODAY, SYSDATE + 1 TOMORROW FROM DUAL;
-- 19/06/06 19/06/07 19/06/08
SELECT ADD_MONTHS(SYSDATE, -1) "전달", ADD_MONTH(SYSDATE, 1), "다음달" FROM DUAL;
-- 19/05/07 19/07/07
SELECT ADD_MONTHS(SYSDATE, -12) "전년", ADD_MONTH(SYSDATE, 12), "내년" FROM DUAL;
-- 18/06/07 20/06/07

 

💊 오늘, (월요일 시작) 이번주 초, 이번주 말, (일요일 시작) 이번주 초, 이번주 말, 월 초, 월말

SELECT TRUNC(SYSDATE) "오늘",
	   SYSDATE -  TO_CHAR(SYSDATE, 'd') + 2 "이번주 초(월요일 시작)", 
       SYSDATE - TO_CHAR(SYSDATE, 'd') + 8 "이번주 말(월요일 시작)",
       TRUNC(SYSDATE, 'MM') "월초", TRUNC(LAST_DAY(SYSDATE)) "월말"
FROM DUAL;
-- 19/06/07		19/06/03	19/06/09	19/06/02	19/06/08	19/06/01	19/06/30

 

💊 요일

참고
1: 일, 2: 월, 3: 화, 4: 수, 5: 목, 6: 금, 7: 토

SELECT TO_CHAR(SYSDATE, 'DAY'), TO_CHAR(SYSDATE, 'DY'), TO_CHAR(SYSDATE, 'D')
FROM DUAL;
-- 금요일 금 6

 

💊 오늘 이후 일주일

SELECT TO_CHAR(SYSDATE + LEVEL, 'YYYY-MM-DD') 일자,
	   TO_CHAR(SYSDATE + LEVEL, 'DAY') 요일 1,
	   TO_CHAR(SYSDATE + LEVEL, 'DY') 요일 2,
	   TO_CHAR(SYSDATE + LEVEL, 'D') 요일 3
FROM DUAL
CONNECT BY LEVEL <= 7;

 

💊 이번달 일수, 이번달 남은 일수, 차이 일수

참고

'2018-06-04' : 현재 일자와 일자 차이를 구하기 위한 시작일수

SELECT CAST (TO_CHAR (LAST_DAY (SYSDATE), 'dd') AS INT) "이번달 일수",
	   LAST_DAY (SYSDATE) - SYSDATE "이버너달 남은 일수",
       ROUND ((MONTHS_BETWEEN (SYSDATE, '2018-06-04') * 30), 0) "차이일수"
FROM DUAL;

 

💊 오늘 경과한 초, 자정까지 남은 초

SELECT (SYSDATE - TRUNC (SYSDATE)) * 24 * 60 * 60 "오늘 경과한 초",
	   (TRUNC (SYSDATE + 1) - SYSDATE) * 24 * 60 * 60 "자정까지 남은 초"
FROM DUAL;

 

💊 hh24:mi:ss를 숫자(시, 분, 초)로 변환

SELECT TO_CHAR(SYSDATE, 'HH24:MI:SS') "시간",
	   ROUND(TO_NUMBER(TO_CHAR(TO_TIMESTAMP(TO_CHAR(SYSDATE, 'HH24:MI:SS'), 'hh24:mi:ss'), 'sssss'))/3600, 0) "시로 변환",
       ROUND(TO_NUMBER(TO_CHAR(TO_TIMESTAMP(TO_CHAR(SYSDATE, 'HH24:MI:SS'), 'hh24:mi:ss'), 'sssss'))/60, 0) "분으로 변환",
       TO_NUMBER(TO_CHAR(TO_TIMESTAMP(TO_CHAR(SYSDATE, 'HH24:MI:SS'), 'hh24:mi:ss'), 'sssss')) "초로 변환",
FROM DUAL;

 

💊 숫자(초)를 hh:24:mi:ss로 변환

참고
1425:초(임의 숫자)

SELECT TO_CHAR(TRUNC(SYSDATE) + NUMTODSINTERVAL(1234, 'second'), 'hh24:mi:ss') "1번째 방법",
	   TO_CHAR(TO_DATE(1245, 'sssss'), 'hh24:mi:ss') "2번째 방법",
       TO_CHAR(TRUNC(1425/3600), 'FM9900') || ':' ||
       TO_CHAR(TRUNC(MOD(1425, 3600)/60),'FM00') || ':' ||
       TO_CHAR(MODE(1425, 60), 'FM00') "3번째 방법"
FROM DUAL;

 

💊 숫자(초)를 dd:hh:mi:ss로 변환 (day 포함)

참고
191425:초(임의 숫자)

SELECT TO_CHAR(TRUNC(191425/(3600*24)), 'FM00') || ':' ||
	   MOD(TRUNC(191425/3600), 24) || ':' ||
       TO_CHAR(TRUNC(MOD(191425, 3600) / 60), 'FM00') || ':' ||
       TO_CHAR(MOD(191425, 60), 'FM00') "dd:hh:mm:ss 로 변경"
FROM DUAL;

 

💊 현재 일자 이전 일자 생성 쿼리

SELECT LEVEL AS LV, TRUNC(SYSDATE) - LEVEL + 1 AS DATE_COL
FROM DUAL
CONNECT BY LEVEL <= 8;

 

💊 현재 일자 사이 MONTH 가져오기

'2019-07-01', '2019-12-13' 임의 일자

WITH TMP_DATE AS (
	SELECT '2019-07-01' START_DATE, '2019-12-13' END_DATE FROM DUAL
)
SELECT TO_CHAR(ADD_MONTHS(TRUNC(TO_DATE(START_DATE), 'MM'), LEVEL - 1), 'YYYYMM') MONTH
FROM TMP_DATE
CONNECT BY  TRUNC(TO_DATE(END_DATE), 'MM') >= ADD_MONTHS(TRUNC(TO_DATE(START_DATE), 'MM'), LEVEL - 1);

 

💊 일자 사이 특정 요일 가져오기

'20191211', '20191231' : 임의 일자, '수' : 임의 요일

SELECT DATE_COL, TO_CHAR(DATE_COL, 'DY')
FROM (
	SELECT TO_DATE('20191201', 'YYYYMMDD') + LEVEL - 1 DATE_COL
    FROM DUAL
    CONNECT BY LEVEL <= (TO_DATE('20191231', 'YYYYMMDD') - TO_DATE('20191201', 'YYYYMMDD') + 1)
)
WHERE TO_CHAR(DATE_COL, 'DY') = '수';

 

💊 현재 일자 월의 모든 일자 가져오기

SELECT TO_CHAR(TRUNC(SYSDATE, 'MONTH') + LEVEL -1, 'YYYYMMDD') DAYS
FROM DUAL
CONNECT BY LEVEL <= TO_NUMBER(TO_CHAR(LAST_DAY(SYSDATE), 'DD'));

SYSDATESTAMP

현재 일자 / 시간 출력
최소단위 = 10억분의 1초 (10의 9승)

SELECT TO_CHAR(SYSTIMESTAMP,'RRRR-MM-DD HH24:MI:SS.FF3')  
  FROM DUAL ;
SELECT TO_CHAR(SYSTIMESTAMP,'RRRR-MM-DD HH24:MI:SS.FF9')  
  FROM DUAL ;
SELECT TO_CHAR(SYSTIMESTAMP -1/24,'RRRR-MM-DD HH24:MI:SS') "1시간전시간"
  FROM DUAL ;
SELECT TO_CHAR(SYSTIMESTAMP -1/24/60,'RRRR-MM-DD HH24:MI:SS') "1분전시간"
  FROM DUAL ;

ADD_MONTHS( a, b)

ADD_MONTHS 함수는 a의 날짜에 b의 달을 더한 값을 반환 한다.

-- SYSDATE를 이용한 예제
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,3),'RRRR-MM-DD')  "date"
  FROM DUAL; 
 
-- TIMESTAMP를 이용한 예제
SELECT TO_CHAR(ADD_MONTHS(SYSTIMESTAMP,3),'RRRR-MM-DD')  "date"
  FROM DUAL;

MONTHS_BETWEEN( a1, a2 )

MONTHS_BETWEEN은 a1과 a2 사이의 달의 수를 NUMBER형 타입으로 반환 한다.

-- 두 일자 사이에 달의 수를 조회하는 예제
SELECT MONTHS_BETWEEN(TO_DATE('2010-06-05','RRRR-MM-DD'), 
                      TO_DATE('2010-05-01','RRRR-MM-DD'))  "month"  
  FROM DUAL;
-- 두 일자 사이에 일짜 수를 조회하는 예제
SELECT TO_DATE('2010-06-05','RRRR-MM-DD') - 
       TO_DATE('2010-05-01','RRRR-MM-DD')  "Day"  
  FROM DUAL;

LAST_DAY(d)

LAST_DAY 함수는 달의 마지막 날의 날짜를 반환 한다

-- LAST_DAY예제
SELECT SYSDATE today, LAST_DAY(SYSDATE) lastday 
  FROM DUAL;
 
TODAY    LASTDAY
-------- --------
11/05/28 11/05/31

NEXT_DAY( d, c1 )

NEXT_DAY는 돌아오는 명시된 요일의 일자를 반환한다.
요일은 1(일) ~ 7(토)로 입력하면 된다.

-- NEXT_DAY예제
SELECT NEXT_DAY(SYSDATE, 4) "Next Wednesday"
  FROM DUAL;
 
Next Wed
--------
11/06/01
-- NEXT_DAY예제
SELECT NEXT_DAY(TO_DATE('20110501','RRRRMMDD'), 2) "5월 첫째주 월요일"
  FROM DUAL;
 
5월 첫째
--------
11/05/02

ROUND( d[,F] )

ROUND 함수는 F에 지정된 단위로 반올림 한다. F가 연도라면 연도 단위로 반올림 한다. F가 생략되면 날짜를 가장 가까운 날짜로 반올림한다.

-- ROUND예제
SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'YEAR'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;
 
SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'MONTH'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;
 
SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'DD'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;
 
SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS')), 
               'RRRR-MM-DD HH24:MI:SS')   
  FROM DUAL;
 
 
-- 실행 결과
2012-01-01 00:00:00
2011-09-01 00:00:00
2011-09-12 00:00:00
2011-09-12 00:00:00

TRUNC( d[,F] )

TRUNC 함수는 F에 지정된 단위로 절삭 한다.

-- TRUNC예제
SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'YEAR'),
              'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;
 
SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), MONTH'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;
 
SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'DD'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;
 
SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS')), 
               'RRRR-MM-DD HH24:MI:SS')   
  FROM DUAL;
 
 
-- 실행 결과
2011-01-01 00:00:00 
2011-09-01 00:00:00
2011-09-11 00:00:00
2011-09-11 00:00:00

 

 

출처
https://m.blog.naver.com/chsmanager/221556867403

http://www.gurubee.net/lecture/1026

 

728x90
반응형

'언어 > SQL' 카테고리의 다른 글

집계함수 (COUNT, MAX, MIN, AVG, SUM, STDDEV)  (0) 2022.06.14
변환 함수(TO_CHAR, TO_DATE, TO_NUMBER)  (0) 2022.06.14
시간/날짜 함수 (MYSQL)  (0) 2022.06.13
문자형 함수  (0) 2022.06.13
숫자형 함수  (0) 2022.06.13