CodeGym /행동 /SQL SELF /날짜 포맷 변환하기

날짜 포맷 변환하기

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

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에 넣기 전에 검증하자.

시간 포맷 잘못 쓰기. 예를 들어 TIMESTAMPDATE용 템플릿으로 처리하려고 하면 에러가 날 수 있어. 꿀팁: 데이터 타입이랑 포맷이 맞는지 꼭 확인하자.

TO_CHAR()TO_DATE() 함수는 날짜 데이터 다루는 데 진짜 유용해. 리포트용 포맷 만들기, 사용자 입력 변환, SQL 쿼리를 더 읽기 쉽게 만들 수 있어. 실제로 데이터 시각화, 리포트 생성, 다른 시스템이랑 연동, 사용자 인터페이스 준비할 때 엄청 많이 써!

2
과제
SQL SELF, 레벨 31, 레슨 3
잠금
현재 날짜 포매팅
현재 날짜 포매팅
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION