MySQL에서 날짜 데이터를 다룰 때 자주 헷갈리는 것들:
DATE, DATETIME, 문자열의 차이등등을 예제 기반으로 정리해본다.
ANIMAL_INS 테이블에서 다음을 조회해야 한다:
| 출력 컬럼 | 설명 |
|---|---|
ANIMAL_ID | 동물 ID |
NAME | 동물 이름 |
날짜 | 보호소 들어온 날짜 (⚠️ 시분초 없이 날짜만!) |
정렬 기준: ANIMAL_ID 오름차순
→ 즉, DATETIME 컬럼에서 날짜(년-월-일)만 출력해야 함
| 컬럼명 | 타입 | 예시 |
|---|---|---|
DATETIME | DATETIME | 2018-01-22 14:32:00 |
👉 여기서 DATETIME 타입이 핵심이다.
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 타입으로 변환함DATETIME처럼 보이게 할 수 있음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()은 날짜를 문자열로 포맷해서 출력해줌
🟢 시분초 없이 깔끔하게 출력 가능
🟢 코딩 테스트 출력 요구사항 충족 가능!
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지만, 출력 포맷은 통제 안 됨
'2022-10-05' -- 날짜처럼 보이지만 문자열
'2022-10-05 14:30:00' -- DATETIME처럼 보이지만 그냥 문자열
SELECT '2022-10-05' + INTERVAL 1 DAY;
-- 결과: 오류 또는 이상한 값
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 타입)
🔵 문자열을 정확한 날짜 타입으로 바꿔야 연산 가능
🔵 포맷을 지정할 수 있어 안전하고 실무에서도 자주 씀
-- ❌ 비효율적인 방식 (인덱스 못 탐)
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()이 정답이다.