CodeGym /행동 /SQL SELF /날짜 부분 추출하기: EXTRACT()와 AGE()

날짜 부분 추출하기: EXTRACT()와 AGE()

SQL SELF
레벨 31 , 레슨 2
사용 가능

오늘은 시간 데이터 다루는 걸 좀 더 깊게 파볼 거야. EXTRACT() 함수로 연도, 월, 요일 같은 특정 부분만 뽑아내는 법을 배우고, AGE()로 나이나 날짜 간의 간격을 계산하는 것도 알아볼 거야.

실제 프로젝트에서 시간 데이터를 다루다 보면 날짜나 시간에서 특정 부분만 뽑아야 할 때가 많아. 예를 들면:

  • 주문을 연도별이나 월별로 나누기;
  • 특정 요일에 가입한 사용자 수 세기;
  • 두 이벤트 사이의 시간 길이 분석하기.

이런 문제를 해결하려면 EXTRACT()AGE() 함수를 쓰면 돼.

EXTRACT()가 뭐야?

EXTRACT() 함수는 날짜나 타임스탬프에서 원하는 부분만 뽑아낼 수 있어. 예를 들어, 생일에서 연도만 뽑거나, 월 번호를 구하거나, 요일을 추출할 수도 있지.

문법:

EXTRACT(part FROM source)
  • part: 뽑아내고 싶은 날짜의 부분이야. YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 등등이 있어.
  • source: 정보를 뽑아낼 시간 데이터 타입이야. 컬럼, 상수, 함수 결과 등 다 가능해.

예제 1: 연, 월, 일 추출하기

SELECT
    EXTRACT(YEAR FROM '2024-11-15'::DATE) AS year_part,
    EXTRACT(MONTH FROM '2024-11-15'::DATE) AS month_part,
    EXTRACT(DAY FROM '2024-11-15'::DATE) AS day_part;

결과:

year_part month_part day_part
2024 11 15

여기서는 2024-11-15 날짜에서 연, 월, 일을 각각 뽑았어. 이런 방식은 날짜의 특정 부분으로 데이터를 그룹핑할 때 유용해.

예제 2: 요일과 시간 추출하기

SELECT
    EXTRACT(DOW FROM '2024-11-15'::DATE) AS day_of_week,
    EXTRACT(HOUR FROM '15:30:00'::TIME) AS hour_part;

결과:

day_of_week hour_part
3 15
  • DOW (Day of Week)는 요일 번호를 반환해: 일요일은 0, 월요일은 1, 이런 식이야.
  • HOUR는 시간에서 시(hour)만 뽑아내.

예제 3: 컬럼에 적용하기

만약 날짜가 들어있는 테이블이 있다면, 날짜의 부분을 뽑아서 분석할 수 있어. 예를 들어 orders 테이블이 있다고 해보자:

order_id order_date
1 2023-05-12 14:20
2 2023-06-18 10:45
3 2023-07-22 21:15
SELECT
    order_id,
    EXTRACT(MONTH FROM order_date) AS month,
    EXTRACT(DAY FROM order_date) AS day
FROM orders;

결과:

order_id month day
1 5 12
2 6 18
3 7 22

AGE()가 뭐야?

AGE() 함수는 두 개의 시간 값 사이의 차이를 계산할 때 써. 예를 들어, 고객의 생일로 나이를 계산하거나, 주문이 들어온 후 얼마나 지났는지 알 수 있어.

문법:

AGE(timestamp1, timestamp2)
  • timestamp1: 더 나중의 시간 값이야.
  • timestamp2: 더 이른 시간 값이야.
  • 만약 파라미터를 하나만 주면, PostgreSQL이 자동으로 현재 날짜(NOW())랑 비교해줘.

예제 1: 나이 계산하기

SELECT AGE('2025-11-15'::DATE, '1990-05-12'::DATE) AS age;

결과:

age
35 years 6 mons

이 예제는 1990년 5월 12일에 태어난 사람이 2025년 11월 15일 기준으로 몇 살인지 보여줘.

예제 2: 이벤트 간의 시간 간격

SELECT AGE('2023-06-01 15:00'::TIMESTAMP, '2023-05-20 10:30'::TIMESTAMP) AS duration;

결과:

duration
11 days 4:30:00

여기서는 두 이벤트 사이의 시간 간격을 계산했어. 작업 시작과 끝 사이에 얼마나 걸렸는지 알고 싶을 때 유용해.

예제 3: 고객 나이 계산

예를 들어 customers 테이블이 있다고 해보자:

customer_id birth_date
1 1992-03-10
2 1985-07-07

고객의 나이를 계산할 수 있어:

SELECT
    customer_id,
    AGE(NOW(), birth_date) AS age
FROM customers;

2025년 6월 13일 기준 결과:

customer_id age
1 33 years 3 mons
2 39 years 11 mons

물론, 너희는 각자 NOW() 값이 다르니까 결과도 다를 거야.

EXTRACT()AGE() 실전 예제

이제 실제 상황에서 두 함수를 같이 써보자.

예제 1: 월별로 데이터 그룹핑하기

주문 날짜가 있는 테이블이 있다고 해보자. 월별로 주문 수를 세려면 이렇게 하면 돼:

SELECT
    EXTRACT(MONTH FROM order_date) AS order_month,
    COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;

예제 2: 만료일까지 남은 일수 구하기

subscriptions 테이블이 있다고 해보자:

subscription_id expiry_date
1 2023-12-31
2 2024-05-15

구독 만료일까지 얼마나 남았는지 알고 싶으면 이렇게 해:

SELECT
    subscription_id,
    AGE(expiry_date, NOW()) AS time_remaining
FROM subscriptions;

결과:

subscription_id time_remaining
1 1 mons 15 days
2 6 mons

흔한 실수와 피하는 법

EXTRACT()AGE()를 쓸 때 초보자들이 자주 하는 실수들이 있어:

  • TIME 타입에서 월 같은 안 되는 부분을 뽑으려고 하는 경우. 기억해: YEAR, MONTH, DAYDATETIMESTAMP에서만 되고 TIME에서는 안 돼.
  • 시간 데이터 포맷이 달라서 생기는 문제. 예를 들어 2023/11/15는 날짜로 인식 안 돼. ::DATETO_DATE()로 타입 변환을 꼭 해줘.
  • AGE()와 시간 값 빼기의 차이. 정확한 간격(월, 일, 초 등)이 필요하면 AGE()를 쓰고, 그냥 일수만 필요하면 산술 연산으로 빼도 돼.

이제 PostgreSQL에서 시간 데이터의 부분을 뽑고 분석하는 데 필요한 모든 스킬을 갖췄어. EXTRACT()AGE()를 직접 프로젝트에서 써보면서 익혀봐!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION