날짜·시간 데이터 타입

날짜·시간 데이터 타입

PostgreSQL은 SQL 표준의 날짜·시간 타입을 모두 지원해요. 날짜만, 시간만, 그리고 둘을 같이 담는 타입까지 다양하죠. 여기에 더해 시차(time zone)와 정밀도(precision)라는 개념이 얽혀 있어서 처음엔 조금 복잡하게 느껴질 수 있어요. 그래서 이번에는 각 타입의 특징과 입력·출력 방식을 정리해 볼게요.

출처: PostgreSQL 공식 문서 — Date/Time Types

본문

주요 타입 한눈에 보기

PostgreSQL이 제공하는 주요 날짜·시간 타입은 다음과 같아요.

이름 저장 크기 설명 최소 값 최대 값 해상도
timestamp [ (p) ] with time zone 8바이트 날짜와 시간(타임존 포함) 4713 BC 294276 AD 1마이크로초
date 4바이트 날짜(시각 없음) 4713 BC 5874897 AD 1일
time [ (p) ] [ without time zone ] 8바이트 하루 중 시각(날짜 없음) 00:00:00 24:00:00 1마이크로초
time [ (p) ] with time zone 12바이트 하루 중 시각(날짜 없음, 타임존 포함) 00:00:00+1559 24:00:00-1559 1마이크로초
interval [ fields ] [ (p) ] 16바이트 시간 간격 -178000000년 178000000년 1마이크로초

time, timestamp, interval은 선택적인 정밀도 값 p를 받는데, 이는 초 필드에 유지할 소수 자릿수를 의미해요. 기본적으로 정밀도에 대한 명시적인 상한은 없고, p의 허용 범위는 0부터 6까지예요. 날짜는 그레고리력에 따라 세어요. 심지어 그 달력이 도입되기 전 연도도 마찬가지예요.

입력 방식

상수 지정(constant specification)에서 정밀도를 지정하지 않으면, 리터럴 값의 정밀도(단, 6자리를 넘지 않음)로 기본 설정돼요. 문자열로 날짜·시간 값을 넣을 때 PostgreSQL이 여러 가지 형식을 자동으로 해석해 주는 덕분에, 자연스러운 표기로 값을 넣을 수 있어요.

출력 방식

날짜·시간 타입의 출력 형식은 네 가지 스타일 중 하나로 설정할 수 있어요. ISO 8601, SQL(Ingres), 전통적인 POSTGRES(Unix 날짜 형식), 그리고 German 형식이에요. 기본값은 ISO 형식이에요. (SQL 표준은 ISO 8601 형식을 요구해요.)

타임존

date 타입은 타임존을 가질 수 없지만, time 타입은 가질 수 있어요. 다만 실제 세계에서 타임존은 날짜와 시간이 함께 있을 때 의미가 있어요. 일광 절약 시간 경계 때문에 오프셋이 해마다 달라질 수 있거든요. 그래서 시각만 있는 time에 타임존을 붙이는 건 실무에서 거의 쓰이지 않아요. 시각과 날짜를 함께 다루는 timestamp with time zone을 쓰는 게 일반적이죠.

interval의 내부 저장 방식

내부적으로 interval 값은 달(months), 일(days), 마이크로초(microseconds)라는 세 개의 정수 필드로 저장돼요. 이 필드들을 분리해 둔 이유가 있어요. 한 달의 일 수는 달마다 다르고, 일광 절약 시간 전환에 따라 하루가 23시간이나 25시간이 될 수도 있기 때문이에요. 그래서 시간 간격을 단순히 하나의 숫자로 표현하지 않고 세 부분으로 나눠 보존하는 거예요.

더 알아보기