운동은 한 시간 반 동안 하고, 근무 시간은 8시간, 쉬는 시간은 20분, 그리고 계란 삶는 데 10분 걸려. 이 모든 게 바로 시간 간격에 대한 얘기야.
시간 간격은 실제 앱에서 진짜 유용해. 예를 들어, 작업 마감일 계산하거나, 두 날짜 사이의 차이를 구하거나, 시간을 더하고 빼야 할 때 쓰지. 근데 본격적으로 들어가기 전에, 지난 강의에서 어디까지 했는지 잠깐만 떠올려보자.
PostgreSQL에서 INTERVAL은 시간 간격을 표현하는 특별한 데이터 타입이야. 다른 시간 관련 타입이랑 다르게, 이건 특정 날짜나 시간을 저장하는 게 아니라, "2일", "3시간", "5분"처럼 기간을 나타내는 거지.
INTERVAL 문법
간격은 이런 식으로 쓸 수 있어:
INTERVAL '숫자 시간_단위'
예시:
INTERVAL '2 days' -- 이틀
INTERVAL '3 hours' -- 세 시간
INTERVAL '15 minutes' -- 열다섯 분
INTERVAL '1 day 2 hours' -- 하루 이틀 두 시간
PostgreSQL은 여러 시간 단위를 지원해: year, month, day, hour, minute, second. 이걸 한 번에 조합해서 쓸 수도 있어.
쿼리에서 INTERVAL 사용하기
INTERVAL 데이터 타입은 다른 시간 타입(DATE, TIMESTAMP)이랑 같이 쓸 때 진짜 빛을 발해. 주요 연산을 같이 보자.
날짜/시간에 간격 더하기
간격은 날짜나 시간 값에 더할 수 있어. 예를 들어:
SELECT CURRENT_DATE + INTERVAL '7 days' AS delivery_date;
-- 오늘부터 7일 뒤 날짜 구하기
결과:
| delivery_date |
|---|
| 2023-10-08 |
날짜/시간에서 간격 빼기
더하는 것뿐만 아니라, 간격을 뺄 수도 있어:
SELECT NOW() - INTERVAL '2 hours' AS two_hours_ago;
-- 두 시간 전 시간 구하기
결과:
| two_hours_ago |
|---|
| 2023-10-01 10:00:00.000 |
두 날짜 사이의 차이 계산하기
INTERVAL의 강력한 기능 중 하나는 두 날짜 사이의 차이를 계산하는 거야:
SELECT '2023-10-15'::DATE - '2023-10-01'::DATE AS days_difference;
-- 두 날짜 사이 며칠 차이인지 구하기
결과:
| days_difference |
|---|
| 14 days |
여기서 결과도 시간 간격 형태로 나오는 거 참고해.
INTERVAL 실전 예제
배송 날짜 계산하기. 온라인 쇼핑몰에서 배송이 3일에서 7일 걸린다고 해보자. 이렇게 배송 가능한 날짜를 계산할 수 있어:
SELECT CURRENT_DATE + INTERVAL '3 days' AS earliest_delivery,
CURRENT_DATE + INTERVAL '7 days' AS latest_delivery;
결과:
| earliest_delivery | latest_delivery |
|---|---|
| 2023-10-04 | 2023-10-08 |
작업 완료 시간 계산하기. 예를 들어 tasks라는 테이블이 있고, 각 작업마다 시작 날짜가 있다고 해보자. 작업 소요 시간(시간 단위)을 고려해서 종료 날짜를 계산해야 해:
CREATE TABLE tasks (
task_id SERIAL PRIMARY KEY,
task_name TEXT,
start_time TIMESTAMP,
duration INTERVAL
);
INSERT INTO tasks (task_name, start_time, duration)
VALUES
('보고서 준비', '2023-10-01 09:00:00', INTERVAL '4 hours'),
('앱 테스트', '2023-10-01 10:00:00', INTERVAL '2 hours 30 minutes');
SELECT task_name,
start_time,
start_time + duration AS end_time
FROM tasks;
결과:
| task_name | start_time | end_time |
|---|---|---|
| 보고서 준비 | 2023-10-01 09:00:00 | 2023-10-01 13:00:00 |
| 앱 테스트 | 2023-10-01 10:00:00 | 2023-10-01 12:30:00 |
작업 소요 시간 비교하기. 가끔 3시간보다 빨리 끝난 작업만 찾고 싶을 때가 있어:
SELECT task_name
FROM tasks
WHERE duration < INTERVAL '3 hours';
결과:
| task_name |
|---|
| 앱 테스트 |
INTERVAL 꿀팁
동적으로 간격 계산하기. 간격을 다른 연산이랑 조합할 수도 있어. 예를 들어, 컬럼에서 일 수를 가져와서 INTERVAL로 바꿔보자:
SELECT CURRENT_DATE + (order_days || ' days')::INTERVAL AS order_due_date
FROM orders;
INTERVAL을 문자열로 변환하기. 가끔 간격을 문자열로 바꿔서 보여줘야 할 때가 있어:
SELECT INTERVAL '2 days 3 hours'::TEXT AS interval_text;
결과:
| interval_text |
|---|
| 2 days 03:00:00 |
INTERVAL 쓸 때 자주 하는 실수
INTERVAL이 강력하긴 한데, 쓰다 보면 헷갈릴 때가 있어. 대표적인 실수는 잘못된 포맷을 쓰는 거야. 예를 들어, INTERVAL '2 hours and 30 minutes' 이렇게 쓰면 에러 나. PostgreSQL은 "and" 같은 단어를 이해 못 하거든. 올바른 방식은 INTERVAL '2 hours 30 minutes'야.
또 다른 실수는 시간 단위를 빼먹는 거야, 예를 들어 INTERVAL '2' 이렇게 쓰면 PostgreSQL이 "2"가 뭔지 몰라. 항상 단위를 명확하게 써줘야 해(2 days, 2 hours처럼).
GO TO FULL VERSION