오늘은 시간 데이터 다루는 걸 좀 더 깊게 파볼 거야. 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,DAY는DATE나TIMESTAMP에서만 되고TIME에서는 안 돼.- 시간 데이터 포맷이 달라서 생기는 문제. 예를 들어
2023/11/15는 날짜로 인식 안 돼.::DATE나TO_DATE()로 타입 변환을 꼭 해줘. AGE()와 시간 값 빼기의 차이. 정확한 간격(월, 일, 초 등)이 필요하면AGE()를 쓰고, 그냥 일수만 필요하면 산술 연산으로 빼도 돼.
이제 PostgreSQL에서 시간 데이터의 부분을 뽑고 분석하는 데 필요한 모든 스킬을 갖췄어. EXTRACT()랑 AGE()를 직접 프로젝트에서 써보면서 익혀봐!
GO TO FULL VERSION