DATETIME, DATE, 문자열 형변환 정리 (+ 출력 포맷)

창하쿠·2025년 5월 27일

sql questions

목록 보기
5/7

MySQL에서 날짜 데이터를 다룰 때 자주 헷갈리는 것들:

  • DATE, DATETIME, 문자열의 차이
  • 날짜 형변환
  • 시·분·초 없이 날짜만 출력하는 법

등등을 예제 기반으로 정리해본다.


✅ 문제 요약

ANIMAL_INS 테이블에서 다음을 조회해야 한다:

출력 컬럼설명
ANIMAL_ID동물 ID
NAME동물 이름
날짜보호소 들어온 날짜 (⚠️ 시분초 없이 날짜만!)

정렬 기준: ANIMAL_ID 오름차순
→ 즉, DATETIME 컬럼에서 날짜(년-월-일)만 출력해야 함


✅ 테이블 구조 (중요 포인트 🔥)

컬럼명타입예시
DATETIMEDATETIME2018-01-22 14:32:00

👉 여기서 DATETIME 타입이 핵심이다.


✅ 1. 출력 결과가 왜 이상할까?

SELECT ANIMAL_ID, NAME, CAST(DATETIME AS DATE)
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

예상:

2018-01-22

실제 출력:

2018-01-22 00:00:00  ← ❗ 뭐야? 시분초 왜 붙음?

❓ 이유

  • CAST()는 진짜로 DATE 타입으로 변환함
  • 하지만 MySQL은 출력 형식DATETIME처럼 보이게 할 수 있음
  • 즉, 타입은 맞는데 보이는 게 이상함

✅ 2. 진짜 시분초 없이 출력하려면?

✅ 방법: DATE_FORMAT() 사용

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

결과:

2018-01-22
2017-08-13

🟢 DATE_FORMAT()은 날짜를 문자열로 포맷해서 출력해줌
🟢 시분초 없이 깔끔하게 출력 가능
🟢 코딩 테스트 출력 요구사항 충족 가능!


✅ 3. 다른 방식들은 어떨까?

방법 ① CAST(DATETIME AS DATE)

SELECT CAST('2022-10-05 14:30:00' AS DATE);
-- 결과: 2022-10-05 00:00:00 ← 출력 시 시분초 붙음

방법 ② DATE() 함수

SELECT DATE('2022-10-05 14:30:00');
-- 결과: 2022-10-05 00:00:00 ← 이것도 시분초 생김

🟡 둘 다 내부 타입은 DATE지만, 출력 포맷은 통제 안 됨


✅ 4. 그럼 문자열은?

문자열 예시:

'2022-10-05'                   -- 날짜처럼 보이지만 문자열
'2022-10-05 14:30:00'          -- DATETIME처럼 보이지만 그냥 문자열

❌ 문자열은 날짜 연산 불가:

SELECT '2022-10-05' + INTERVAL 1 DAY;
-- 결과: 오류 또는 이상한 값

✅ 5. 문자열 → 날짜 타입으로 바꾸는 법

방법: STR_TO_DATE()

SELECT STR_TO_DATE('2022-10-05', '%Y-%m-%d');
-- 결과: 2022-10-05 (DATE 타입)

SELECT STR_TO_DATE('2022-10-05 14:30:00', '%Y-%m-%d %H:%i:%s');
-- 결과: 2022-10-05 14:30:00 (DATETIME 타입)

🔵 문자열을 정확한 날짜 타입으로 바꿔야 연산 가능
🔵 포맷을 지정할 수 있어 안전하고 실무에서도 자주 씀


✅ 6. WHERE 조건에서 날짜 비교할 때 주의점 ⚠️

-- ❌ 비효율적인 방식 (인덱스 못 탐)
WHERE DATE(DATETIME) = '2022-10-05';

-- ✅ 성능 좋은 방식
WHERE DATETIME >= '2022-10-05'
  AND DATETIME < '2022-10-06';

💡 DATE() 같은 함수는 인덱스를 깨버리므로 조건절에는 쓰지 않는 게 좋다


✅ 최종 정답 쿼리 ✅

SELECT
  ANIMAL_ID,
  NAME,
  DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

→ 문제에서 요구한 “날짜만 출력” 조건을 정확히 만족
→ 시분초 없이 깔끔하게 2022-10-05 형식으로 출력됨


✅ 핵심 요약표 🧠

상황함수예시
DATETIME → DATE 타입 (내부 변환)CAST() or DATE()CAST(DATETIME AS DATE)
DATETIME → 시분초 없이 출력DATE_FORMAT()DATE_FORMAT(DATETIME, '%Y-%m-%d')
문자열 → DATE 타입STR_TO_DATE()STR_TO_DATE('2022-10-05', '%Y-%m-%d')
WHERE 절 최적화범위 조건 사용DATETIME >= '2022-10-05' AND DATETIME < '2022-10-06'

✅ 마무리 요약 ✍️

MySQL은 타입과 출력 형식이 다를 수 있다.
CAST()DATE()는 내부 변환만 할 뿐, 보이는 형식은 여전히 이상할 수 있음.
진짜로 날짜만 출력하려면 DATE_FORMAT()이 정답이다.

profile
아무것도 모르는 아무개

0개의 댓글