DB랑 프론트엔드 세계는 날짜가 어떻게 보여야 하는지에 대해 자주 의견이 안 맞아. PostgreSQL은 DATE, TIMESTAMP, 심지어 TIMESTAMPTZ로 날짜를 저장할 수 있는데, 이 포맷이 항상 사용자한테 보여주기 좋은 건 아니거든. 예를 들어, 기본 2023-10-01 12:30:45 대신에 디자이너들은 2023년 10월 01일, 12:30 이런 식으로 보고 싶어할 수도 있어. 또 어떤 곳에선 리포트나 API용으로 날짜 포맷을 바꿔야 할 때도 있고.
날짜를 문자열로 바꾸거나, 다시 날짜로 바꿀 때 PostgreSQL에선 TO_CHAR()랑 TO_DATE() 함수를 써.
TO_CHAR() 함수
TO_CHAR()는 날짜나 타임스탬프를 사람이 읽기 쉬운 문자열로 바꿔주는 베프야. 날짜나 타임스탬프를 받아서, 네가 원하는 포맷대로 문자열로 만들어줘.
문법
TO_CHAR(value, format)
value— 변환할 날짜나 타임스탬프.format— 날짜를 어떻게 보여줄지 정하는 포맷 문자열.
포맷 예시
| 포맷 템플릿 | 설명 | 예시 |
|---|---|---|
YYYY |
연도 | 2023 |
MM |
월 (01~12 숫자) | 10 |
MONTH |
월 이름 (대문자) | OCTOBER |
DAY |
요일 (대문자) | SUNDAY |
DD |
일 | 01 |
HH24 |
24시간제 시 | 15 |
MI |
분 | 45 |
SS |
초 | 30 |
더 많은 포맷은 PostgreSQL 공식 문서에서 볼 수 있어.
TO_CHAR() 사용 예시
리포트용 날짜 포맷팅
SELECT TO_CHAR(NOW(), 'DD.MM.YYYY') AS formatted_date;
-- 결과: '09.10.2023'
12시간제로 시간 보여주기
SELECT TO_CHAR(NOW(), 'HH12:MI AM') AS formatted_time;
-- 결과: '03:45 PM'
월을 글자로 출력하기
SELECT TO_CHAR(NOW(), 'Month') AS month_name;
-- 결과: 'October '
참고: PostgreSQL은 끝에 공백을 붙여줘. 이건 버그가 아니라 원래 그런 거야! 공백을 없애고 싶으면 TRIM() 함수를 써:
SELECT TRIM(TO_CHAR(NOW(), 'Month')) AS trimmed_month_name;
커스텀 포맷 만들기
SELECT TO_CHAR(NOW(), 'YYYY/MM/DD HH24:MI:SS') AS custom_format;
-- 결과: '2023/10/09 15:45:30'
사용자 인터페이스용 포맷팅
SELECT TO_CHAR(NOW(), 'DD "월" YYYY년') AS user_friendly_date;
-- 결과: '09 월 2023년'
TO_DATE() 함수
TO_DATE()는 반대로 문자열을 DATE 타입으로 바꿔줘. 이게 왜 필요하냐면, 예를 들어 사용자가 01-10-2023 이런 식으로 날짜를 입력하면, PostgreSQL이 이걸 날짜로 "이해"해야 하거든.
문법
TO_DATE(value, format)
value— 날짜가 들어있는 문자열.format— 문자열 포맷을 설명하는 템플릿.
TO_DATE() 사용 예시
문자열을 날짜로 변환하기
SELECT TO_DATE('01-10-2023', 'DD-MM-YYYY') AS date_value;
-- 결과: '2023-10-01' (데이터 타입: DATE)
문자열 날짜랑 테이블 날짜 비교하기
예를 들어 appointments라는 테이블에 appointment_date라는 DATE 타입 컬럼이 있다고 해보자. 사용자가 날짜를 문자열로 입력하면:
SELECT *
FROM appointments
WHERE appointment_date = TO_DATE('2023-10-09', 'YYYY-MM-DD');
잘못된 포맷
중요: 문자열 포맷이 템플릿이랑 다르면 에러가 나! 예를 들어:
SELECT TO_DATE('01/10/2023', 'DD-MM-YYYY');
-- 에러: 잘못된 입력 포맷
사용자 데이터 검증하기
예를 들어 주문을 저장하는 테이블을 만들고, 사용자가 날짜를 입력한다고 해보자:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date DATE
);
-- 문자열을 날짜로 변환해서 데이터 넣기
INSERT INTO orders (order_date)
VALUES (TO_DATE('10-09-2023', 'MM-DD-YYYY'));
실전 예제
리포트 포맷팅. sales 테이블에 sale_date (타입 TIMESTAMP) 컬럼이 있다고 해보자. 날짜를 DD.MM.YYYY 포맷으로 리포트에 보여줘야 해.
-- 예시 데이터
CREATE TABLE sales (
sale_id SERIAL PRIMARY KEY,
sale_date TIMESTAMP
);
INSERT INTO sales (sale_date)
VALUES
('2023-10-01 15:30:00'),
('2023-10-02 10:15:00'),
('2023-10-03 12:45:00');
-- 리포트
SELECT sale_id,
TO_CHAR(sale_date, 'DD.MM.YYYY') AS formatted_date
FROM sales;
사용자 데이터 변환. 사용자가 MM/DD/YYYY 포맷으로 날짜를 입력한다고 해보자. 이걸 DATE로 바꿔서 시스템에 저장해야 해.
INSERT INTO sales (sale_date)
VALUES (TO_TIMESTAMP('10/01/2023 15:30:00', 'MM/DD/YYYY HH24:MI:SS'));
흔한 실수랑 꿀팁
잘못된 포맷. 문자열 포맷이 템플릿이랑 다르면 자주 에러가 나. 예를 들어 사용자가 01-10-2023 이렇게 입력했는데, 포맷을 MM/DD/YYYY로 하면 PostgreSQL이 에러를 뱉어. 꿀팁: SQL에 넘기기 전에 사용자 입력을 꼭 검증해!
TO_CHAR() 포맷의 공백. MONTH 같은 포맷은 공백을 붙여. 이게 문제면 TRIM() 함수를 써.
문자열 파싱 에러. 문자열에 예상치 못한 문자나 포맷이 있으면 PostgreSQL이 변환을 못 해. 꿀팁: 정규식이나 추가 데이터 체크로 DB에 넣기 전에 검증하자.
시간 포맷 잘못 쓰기. 예를 들어 TIMESTAMP를 DATE용 템플릿으로 처리하려고 하면 에러가 날 수 있어. 꿀팁: 데이터 타입이랑 포맷이 맞는지 꼭 확인하자.
TO_CHAR()랑 TO_DATE() 함수는 날짜 데이터 다루는 데 진짜 유용해. 리포트용 포맷 만들기, 사용자 입력 변환, SQL 쿼리를 더 읽기 쉽게 만들 수 있어. 실제로 데이터 시각화, 리포트 생성, 다른 시스템이랑 연동, 사용자 인터페이스 준비할 때 엄청 많이 써!
GO TO FULL VERSION