CodeGym /행동 /SQL SELF /현재 날짜와 시간 가져오는 함수들: NOW(), CURRENT_D...

현재 날짜와 시간 가져오는 함수들: NOW(), CURRENT_DATE, CURRENT_TIME

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

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_TIMESTAMPSQL 표준에서 정의된 표현식이고, PostgreSQL에서도 TIMESTAMP WITH TIME ZONE을 돌려줘. 사실 PostgreSQL은 CURRENT_TIMESTAMPNOW()랑 똑같이 처리해.

예시:

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() 함수로 날짜와 시간의 일부만 뽑아내는 방법을 배울 거야. 이걸로 나이 계산이나, 일/월/년 단위로 데이터 처리하는 것도 쉽게 할 수 있어.

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