💡 Lecture/데이터분석가 회사에서 많이 쓰는 완전 기초 쿼리

[SQL] 데이터분석가 회사에서 많이 쓰는 완전 기초 쿼리 2탄 : 시간 함수

미미누 2023. 11. 9. 22:07

 

 

https://www.youtube.com/watch?v=u8G5WAS8_hU

본 글은 [SQL] 데이터분석가 회사에서 많이 쓰는 완전 기초 쿼리, 을 시청하고 정리한 글입니다.

 


 

현재 시각 나타내기

  • 오라클SQL (FROM 테이블명 DUAL은 가짜테이블)
SELECT SYSDATE FROM DUAL;
SELECT CURRENT_DATE FROM DUAL;
SELECT CURRENT_TIMESTAMP FROM DUAL;

 

임팔라SQL

SELECT NOW();

 

MSSQL

SELECT GETDATE();

 

CHAR 타입을 시간 유형으로 바꾸는 방법

SELECT STD_MT
	, CONCAT(STD_MT, '01') AS 일자1
  , TO_TIMESTAMP(STD_MT, '01'), 'yyyyMMdd') AS 일자2
  , to_date(CONCAT(STD_MT, '01'), 'yyyyMMdd') AS 일자3
  , ADD_MONTHS(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), 1) AS 월더하기1
  , ADD_MONTHS(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), -1) AS 월빼기
  , TO_CHAR(ADD_MONTHS(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), 1), 'yyyyMMdd') AS 월더하기2
  , TO_CHAR(ADD_MONTHS(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), 1), 'yyyyMM') AS 월더하기3
  , from_timestamp((ADD_MONTHS(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), 1), 'yyyyMM') AS 월더하기3
FROM DASQL.TB_PBTRNSP

 

임팔라 SQL에서 CHAR 타입을 시간 유형으로 바꾸는 방법

SELECT STD_MT
		, DATE_ADD(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), INTERVAL 7 DAY) AS 일더하기
		, DATE_SUB(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), INTERVAL 7 DAY) AS 일더하기
    , DATE_SUB(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), INTERVAL -1 MONTH) AS 월더하기
    , DATE_SUB(TO_TIMESTAMP(CONCAT(STD_MT, '01'), 'yyyyMMdd'), INTERVAL -1 YEAR) AS 년더하기

FROM DASQL.TB_PBTRNSP
;

 

시간 형태의 컬럼 에서 년도,월,분,시간 형태를 추출하는 방법

SELECT SYSDATE AS 시간
			, CAST(SYSDATE AS TIMESTAMP) AS 시간2
			, EXTRACT(YEAR FROM CAST(SYSDATE AS TIMESTAMP)) AS 년도
			, EXTRACT(MONTH FROM CAST(SYSDATE AS TIMESTAMP)) AS 월
			, EXTRACT(DAY FROM CAST(SYSDATE AS TIMESTAMP)) AS 일
			, EXTRACT(HOUR FROM CAST(SYSDATE AS TIMESTAMP)) AS 시간
			, EXTRACT(MINUTE FROM CAST(SYSDATE AS TIMESTAMP)) AS 분
			, EXTRACT(SECOND FROM CAST(SYSDATE AS TIMESTAMP)) AS 초
			, TO_CHAR(SYSDATE, 'YYYY') AS 년도
			, TO_CHAR(SYSDATE, 'MM') AS 월
			, TO_CHAR(SYSDATE, 'DD') AS 일
			, TO_CHAR(SYSDATE, 'HH24') AS 시간
			, TO_CHAR(SYSDATE, 'MI') AS 분
			, TO_CHAR(SYSDATE, 'SS') AS 초
			, TO_CHAR(SYSDATE, 'YYYYMMDD') AS 년월일1
			, TO_CHAR(SYSDATE, 'YYMMDD') AS 년월일2
			, TO_CHAR(SYSDATE, 'YY/MM/DD') AS 년월일3
			, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS 년월일4

FROM DUAL
;

 

일차이/년차이/월차이 계산하기

SELECT TO_DATE('20220601', 'yyyyMMdd') - TO_DATE('20220301', 'yyyyMMdd') AS 일차이
			 , (TO_DATE('20220601', 'yyyyMMdd') - TO_DATE('20220301', 'yyyyMMdd'))/365 AS 년차이
			 , (TO_DATE('20220601', 'yyyyMMdd') - TO_DATE('20220301', 'yyyyMMdd'))/365*12 AS 월차이1
       , MONTHS_BETWEEN('20220601', '20220301') AS 월차이2
			 , ROUND((TO_DATE('20220601', 'yyyyMMdd') - TO_DATE('20220301', 'yyyyMMdd'))/365, 2) AS 년차이_반올림
			 , ROUND((TO_DATE('20220601', 'yyyyMMdd') - TO_DATE('20220301', 'yyyyMMdd'))/365*12) AS 월차이_반올림
			 , CEIL((TO_DATE('20220601', 'yyyyMMdd') - TO_DATE('20220301', 'yyyyMMdd'))/365*12) AS 월차이_올림
       , FLOOR((TO_DATE('20220601', 'yyyyMMdd') - TO_DATE('20220301', 'yyyyMMdd'))/365*12) AS 월차이_내림
       , TRUNC(TO_DATE('20220618', 'yyyyMMdd'), 'MONTH') AS 처음일자
       , LAST_DAY(TO_DATE('20220618', 'yyyyMMdd')) AS 마지막일
       , LAST_DAY(TO_DATE('20220618', 'yyyyMMdd')) - TO_DATE('20220617', 'yyyyMMdd') AS 남은일수
FROM dual
;

 

날짜 나타내기

  • ‘Day’ or ‘day’는 한국어에는 상관 없지만, 영어에서는 앞글자 대문자 여부를 나타냄
SELECT TO_CHAR(TO_DATE('20220618', 'yyyyMMdd'), 'Day') AS 요일1 -- Saturday
			, TO_CHAR(TO_DATE('20220618', 'yyyyMMdd'), 'day') AS 요일2 -- saturday 
			, TO_CHAR(TO_DATE('20220618', 'yyyyMMdd'), 'Dy') AS 요일3 -- Sat
			, TO_CHAR(TO_DATE('20220618', 'yyyyMMdd'), 'dy') AS 요일4 -- sat
      , TO_CHAR(TO_DATE('20220618', 'yyyyMMdd'), 'd' AS 요일5 -- 7
FROM DUAL
;