데이터 타입 포맷팅 함수

데이터 타입 포맷팅 함수 (to_char·to_date·to_number·to_timestamp)

날짜를 특정 형식의 문자열로, 또는 그 반대로 바꿔야 할 때가 많죠. 그럴 때 쓰는 것이 포맷팅 함수예요. PostgreSQL의 포맷팅 함수는 date/time, 정수, 부동소수점, numeric 등 다양한 타입을 형식화된 문자열로 바꾸고, 또 그 반대로 문자열을 특정 타입으로 되돌리는 강력한 도구 모음이에요. 공통 규칙은 첫 인자가 포맷할 값, 두 번째 인자가 출력(또는 입력) 형식을 정의하는 템플릿이라는 점이에요.

출처: PostgreSQL 공식 문서 — Data Type Formatting Functions

주요 포맷팅 함수

함수 설명 예시
to_char(timestamp, text)text 타임스탬프를 주어진 형식에 따라 문자열로 변환해요. to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS')05:31:12
to_char(interval, text)text interval을 주어진 형식의 문자열로 변환해요. to_char(interval '15h 2m 12s', 'HH24:MI:SS')15:02:12
to_char(numeric_type, text)text 숫자를 형식에 따라 문자열로 변환해요. integer·bigint·numeric·real·double precision에 사용 가능. to_char(125, '999')125, to_char(125.8::real, '999D9')125.8
to_date(text, text)date 문자열을 주어진 형식에 따라 date로 변환해요. to_date('05 Dec 2000', 'DD Mon YYYY')2000-12-05
to_number(text, text)numeric 문자열을 주어진 형식에 따라 numeric으로 변환해요. to_number('12,454.8-', '99G999D9S')-12454.8
to_timestamp(text, text)timestamp with time zone 문자열을 형식에 따라 타임스탬프로 변환해요. to_timestamp('05 Dec 2000', 'DD Mon YYYY')2000-12-05 00:00:00-05

: to_timestampto_date는 단순 형변환(casting)으로는 처리할 수 없는 입력 형식을 다루기 위해 존재해요. 대부분의 표준 date/time 형식은 원래 문자열을 필요한 타입으로 그냥 캐스팅해도 되고, 그게 훨씬 쉬워요. 마찬가지로 to_number도 표준 숫자 표기에는 필요 없어요.

to_char의 출력 템플릿 문자열에는 특정 패턴이 인식되어 값에 맞게 형식화된 데이터로 치환돼요. 템플릿 패턴이 아닌 텍스트는 그대로 복사됩니다.

날짜/시간 포맷 템플릿 패턴

패턴 설명
HH / HH12 시간 (01–12)
HH24 시간 (00–23)
MI 분 (00–59)
SS 초 (00–59)
MS 밀리초 (000–999)
US 마이크로초 (000000–999999)
FF1~FF6 초의 소수 자릿수 (1=0–9, 3=밀리초, 6=마이크로초)
SSSS / SSSSS 자정 이후 지난 초 (0–86399)
AM/PM (및 소문자) 오전/오후 표시 (점 없이)
A.M./P.M. (및 소문자) 오전/오후 표시 (점 포함)
Y,YYY 콤마가 있는 연도 (4자리 이상)
YYYY / YYY / YY / Y 연도 4자리 / 마지막 3자리 / 2자리 / 1자리
IYYY ISO 8601 주 단위 연도

날짜/시간 템플릿 패턴 수정자

템플릿 패턴에 수정자를 붙여 동작을 바꿀 수 있어요. 예를 들어 FMMonthMonth 패턴에 FM 수정자를 붙인 거예요.

수정자 설명 예시
FM 접두사 채움 모드: 앞의 0과 패딩 공백을 없애요. FMMonth
TH 접미사 대문자 서수 접미사. DDTH (예: 12TH)
FX 접두사 고정 형식 전역 옵션. FX Month DD Day
TM 접두사 번역 모드: lc_time 기반 지역화된 요일·월 이름 사용. TMMonth
SP 접미사 철자 모드 (구현되지 않음). DDSP

FM 수정자는 패턴의 출력을 고정 폭으로 만들기 위해 추가될 앞의 0과 뒤의 공백을 없애요. PostgreSQL에서 FM다음 한 명세에만 영향을 주는 반면, Oracle에서는 이후 모든 명세에 영향을 주고 반복 FM이 채움 모드를 켜고 끄는 점이 달라요.

PostgreSQL 12 이전에는 입력 문자열에서 문자·숫자가 아닌 문자를 사용해 임의 텍스트를 건너뛸 수 있었어요. 예를 들어 to_timestamp('2000y6m1d', 'yyyy-MM-DD')가 동작했죠. 이제는 이 용도에 문자(letter)만 쓸 수 있어요.

숫자 포맷 템플릿 패턴

패턴 설명
9 숫자 위치 (무의미하면 생략 가능)
0 숫자 위치 (무의미해도 생략하지 않음)
. 소수점
, 그룹(천 단위) 구분자
PR 음수를 꺾쇠(<>) 안에 표시
S 부호를 숫자에 고정 (로케일 사용)
L 통화 기호 (로케일 사용)
D 소수점 (로케일 사용)
G 그룹 구분자 (로케일 사용)
MI 지정 위치에 마이너스 부호 (숫자 < 0일 때)

(Oracle 구현은 9 앞에 MI를 쓰는 걸 허용하지 않고, 9 다음에 MI가 오도록 요구해요.) TH는 0보다 작은 값과 분수 값을 변환하지 않아요. PL, SG, TH는 PostgreSQL 확장이에요.

숫자 포맷 수정자도 있어요. FM 접두사는 뒤의 0과 패딩 공백을 없애고, TH·th 접미사는 서수를 붙여요.

to_char 사용 예시 몇 개를 더 볼게요.

to_char(current_timestamp, 'Day, DD  HH12:MI:SS')   → 'Tuesday  , 06  05:39:18'
to_char(current_timestamp, 'FMDay, FMDD  HH12:MI:SS') → 'Tuesday, 6  05:39:18'
to_char(485, 'FMRN')   → 'CDLXXXV'
to_char(5.2, 'FMRN')   → 'V'
to_char(482, '999th')  → ' 482nd'

더 알아보기 (Learn more)