PostgreSQL에는 현재 시간 관련 값들을 다루는 내장 함수들이 몇 개 있어. 이런 함수들은 레코드 생성 시간 자동 기록, 오늘 날짜 기준 리포트 만들기, 특정 기간에 이벤트가 발생했는지 체크할 때 유용하지. 여기서 세 가지 핵심 함수, NOW(), CURRENT_DATE, CURRENT_TIME를 살펴볼게.
NOW(): 현재 날짜와 시간 가져오기
NOW() 함수는 현재 날짜와 시간을 TIMESTAMP WITH TIME ZONE 형식으로 돌려줘. 즉, 결과에 서버 타임존까지 포함된다는 뜻이야.
예시:
SELECT NOW();
-- 결과: 2025-05-25 14:30:45.761523+03
결과에 포함된 것들:
- 날짜 (
2025-05-25), - 시간 (
14:30:45.761523), - 타임존 (
+03).
타임존이 필요 없다면, 결과를 TIMESTAMP로 명시적으로 변환할 수 있어:
SELECT NOW()::TIMESTAMP;
-- 결과: 2025-05-25 14:30:45.761523
CURRENT_DATE: 현재 날짜 가져오기
CURRENT_DATE 함수는 현재 날짜만 돌려주고 시간은 없어. 반환 타입은 DATE야.
예시:
SELECT CURRENT_DATE;
-- 결과: 2025-05-25
시간이 필요 없을 때, 예를 들어 나이 계산이나 날짜별로 데이터 그룹핑할 때 쓰기 좋아.
CURRENT_TIME: 현재 시간 가져오기
CURRENT_TIME 함수는 현재 시간을 TIME WITH TIME ZONE 형식으로 돌려줘. 타임존이 필요 없으면 TIME으로 변환하면 돼.
예시:
SELECT CURRENT_TIME;
-- 결과: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- 결과: 14:30:45.761523
함수들 실전 예제
이 함수들이 실제로 어떻게 쓰이는지 몇 가지 예시를 볼게.
레코드 생성 시간 자동 저장
테이블에 레코드 추가할 때, 생성된 날짜와 시간을 자동으로 저장하는 게 편할 때가 많아. PostgreSQL에서는 테이블 만들 때 DEFAULT NOW()를 지정하면 돼.
테이블 생성 예시:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- 행 생성 시점
);
레코드 추가:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
테이블 내용 확인:
SELECT * FROM orders;
결과:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
날짜로 데이터 필터링
예를 들어 주문 테이블이 있는데, 오늘 생성된 주문만 뽑고 싶다고 해보자. CURRENT_DATE로 필터링하면 돼:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
여기서 created_at::DATE로 시간은 버리고 날짜만 남기는 거야.
NOW()와 CURRENT_TIMESTAMP의 차이
처음 보면 NOW()랑 CURRENT_TIMESTAMP가 똑같아 보여. 사실상 맞아. 단지 NOW()는 한 표준에서, CURRENT_TIMESTAMP는 다른 표준에서 온 거야.
NOW() — PostgreSQL 함수
NOW()는 PostgreSQL 내장 함수로, TIMESTAMP WITH TIME ZONE (timestamptz) 타입 값을 돌려줘. SQL 쿼리 실행 시작 시점의 서버 현재 시간이야.
예시:
SELECT NOW();
CURRENT_TIMESTAMP — SQL 표준
CURRENT_TIMESTAMP는 SQL 표준에서 정의된 표현식이고, PostgreSQL에서도 TIMESTAMP WITH TIME ZONE을 돌려줘. 사실 PostgreSQL은 CURRENT_TIMESTAMP를 NOW()랑 똑같이 처리해.
예시:
SELECT CURRENT_TIMESTAMP;
실전 비교
SELECT NOW(), CURRENT_TIMESTAMP;
결과:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
둘 다 값이 똑같아. 왜냐면 쿼리 시작 시점에 계산되거든.
필터 조건에서 시간 함수 쓰기
이번엔 최근 7일 동안 생성된 레코드만 뽑는 쿼리를 써보자. NOW()랑 날짜 연산을 같이 쓰면 돼:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
비슷하게, 이번 달 주문만 뽑으려면 DATE_TRUNC()로 달의 시작을 잘라서 쓸 수 있어:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC()도 꽤 재밌는 함수인데, 이건 다음 강의에서 더 자세히 다룰게 :P
실전 팁
- 타임존까지 포함된 정확한 시간이 필요하면
NOW()나CURRENT_TIMESTAMP를 써. - 날짜만 있으면 충분한 경우(예: 나이 계산, 특정 날짜 이벤트 분석 등)엔
CURRENT_DATE를 써. CURRENT_TIME는 주로 리포트나 UI에서 작업 소요 시간 보여줄 때 많이 써.
다음 강의에서는 EXTRACT()랑 AGE() 함수로 날짜와 시간의 일부만 뽑아내는 방법을 배울 거야. 이걸로 나이 계산이나, 일/월/년 단위로 데이터 처리하는 것도 쉽게 할 수 있어.
GO TO FULL VERSION