본문 바로가기
Computer Science/프로그래밍 언어

[Oracle] 날짜 데이터 가지고 놀기 📆

by HelloJudy 2023. 11. 22.

📄 TO_CHAR

 

DATE 타입의 데이터를 가지고 원하는 형식으로 출력할 수도 있고 연도, 월, 요일만 추출해서 따로

사용할 수도 있다. 숫자와 날짜 타입을 문자로 변경해주는 형변환 함수이다.

 

✔️ 날짜, 시간 변환

TO_CHAR(SYSDATE,'YYYY') AS YYYY /* 년도 */
TO_CHAR(SYSDATE,'MM') AS MM     /* 숫자 월 표시 */
TO_CHAR(SYSDATE,'MONTH') AS MONTH     /* 긴 영문 월 표시 */
TO_CHAR(SYSDATE,'MON') AS MON     /* 짧은 영문 월 표시 */
TO_CHAR(SYSDATE,'DDD') AS DDD   /* 365일 형태로 일 표시 */
TO_CHAR(SYSDATE,'DD') AS DD     /* 31일 형태로 일 표시 */
TO_CHAR(SYSDATE,'HH24') AS HH24     /* 24시 형태로 시간 표시 */
TO_CHAR(SYSDATE,'HH') AS HH     /* 12시 형태로 시간 표시 */
TO_CHAR(SYSDATE,'HH12') AS HH12     /* 12시 형태로 시간 표시 */
TO_CHAR(SYSDATE,'M1') AS M1     /* 59분 형태로 분 표시 */

 

 

✔️ 요일  변환

TO_CHAR(SYSDATE,'D') AS D        /* 요일 숫자로 표시 (1이 일요일) */
TO_CHAR(SYSDATE,'DAY') AS DAY    /* 긴 요일 표시 */
TO_CHAR(SYSDATE,'DY') AS DY      /* 짧은 요일 표시 */

 

D DAY DY
1 일요일
2 월요일

 

 

📆 TO_DATE

 

문자와 숫자를 날짜로 변경해주는 형변환 함수이다.

 

위 TO_CHAR와 사용법이 유사하다.

 

아래 예시와 같이 작성하면 문자를 날짜로 변경할 수 있다.

TO_DATE('2023-03-02', 'YYYY-MM-DD')

 

 

직접 간단하게 위 함수를 활용해서 쿼리를 작성하면서 감을 찾아보자!

 

📝 프로그래머스 : 조건에 부합하는 중고거래 상태 조회하기

문제 링크

 

웅장하게 제목이 길지만 매우 간단하다.

게시판 데이터가 있는데 여기서 특정 날짜에 데이터를 조회하는 것이다.

 

  • Oracle로 작성
-- 코드를 입력하세요
SELECT BOARD_ID, WRITER_ID, TITLE, PRICE
      , CASE WHEN STATUS = 'SALE' THEN '판매중'
             WHEN STATUS = 'RESERVED' THEN '예약중'
             WHEN STATUS = 'DONE' THEN '거래완료'
        END AS STATUS
FROM USED_GOODS_BOARD
WHERE TO_CHAR(CREATED_DATE, 'YYYY-MM-DD') = '2022-10-05'
ORDER BY BOARD_ID DESC;

 

문제에 CREATED_DATE는 DATE 타입이다. 그래서 조건 절에 비교해 주기 위해서 문자 타입으로 변환해서 작성해 줬다.

 

✨ 응용 1

월화수목금토일을 가진 테이블을 만들자!

 

1) 우선 TRUNC 함수를 사용하면 초기화할 수 있다.

 

이렇게 하면 1이 출력된다. 즉, 현재 어떤 요일이더라도 일요일로 출력된다.

TRUNC(SYSDATE, 'D')

 

 

2) CONNECT BY 절의 LEVEL 활용

 

LEVEL은 1부터 시작하고 CONNECT BY 절의 조건에 따라 순차적으로 증가한다.

이걸 응용해서 작성하면 다음과 같다.

SELECT TO_CHAR(TRUNC(SYSDATE, 'D') + LEVEL, 'DY') AS DAY
FROM DUAL 
CONNECT BY LEVEL <= 7

 

 

✨ 응용 2

생년월일 데이터로 현재 나이, 연령대를 계산해 보자!

그리고 연령대 별로 몇 명의 회원이 있는지 

 

우선 생일 데이터가 아래와 같은 형식으로 String으로 저장되어 있다고 해보자.

Birth Day (YYYYMMDD)
20001225

 

1) 현재 나이 계산

 

현재 나이를 구하기 위해서는 아래와 같은 쿼리를 작성할 수 있다.

SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE(BIRTH_DAY, 'YYYYMMDD')) / 12) AS AGE
FROM CUSTO;

 

[ MONTHS_BETWEEN : 두 날짜의 개월 수 계산하기 ]

 

이렇게 하면 첫 번째 인자에서 두 번째 인자를 빼서 계산한다.

만약 현재 기준으로 구한다고 하면 첫 번째 인자에 SYSDATE를 입력한다.

MONTHS_BETWEEN(날짜데이터1, 날짜데이터2)

 

 

2) 연령대 계산

 

TRUNC 함수를 통해서 일의 자리를 버리고 연령대를 계산할 수 있다.

SELECT TRUNC(TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE(BIRTH_DAY, 'YYYYMMDD')) / 12), -1) AS AGE_GROUP
FROM CUSTO;

 

이렇게 되면 10세 미만. 즉, 0세~9세는 연령대가 0대가 된다.

이런 점을 고려해서 10대 미만은 기타로 분류해 줄 수도 있다.

 

SELECT CASE WHEN T1.AGE_GROUP = 0 THEN '기타'
       ELSE T1.AGE_GROUP || '대'
       END AS AGE_GROUP
FROM (
      SELECT TRUNC(TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE(BIRTH_DAY, 'YYYYMMDD')) / 12), -1) AS AGE_GROUP
      FROM CUSTO
      ) T1;

 

 

3) 연령대 별 회원 수 계산하기

 

서브쿼리로 먼저 연령대를 구하고 인원수를 계산할 수 있다.

SELECT SELECT CASE WHEN T1.AGE_GROUP = 0 THEN '기타'
       ELSE T1.AGE_GROUP || '대'
       END AS AGE_GROUP     /* 연령대 */
     , COUNT(*) AS CNT      /* 회원수 */
FROM (
	SELECT TRUNC(TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE(BIRTH_DAY, 'YYYYMMDD')) / 12), -1) AS AGE_GROUP
	FROM CUSTO
	) AS T1
GROUP BY T1.AGE_GROUP
ORDER BY AGE_GROUP;

 

 


📌 Reference 

반응형

댓글