| 타입 | 설명 |
|---|---|
| DATE | 날짜만 저장 (YYYY-MM-DD) |
| DATETIME | 날짜 + 시간 저장 (YYYY-MM-DD HH:MM:SS) |
| TIMESTAMP | 날짜 + 시간 저장 (시간대 영향 받음, 시스템 시간 기반) |
DATE → 2021-10-05
DATETIME → 2021-10-05 14:32:10
DATETIME은 문자열처럼 보이지만 실제로는 날짜 타입이다.
따라서 문자열 비교(LIKE)보다 범위 비교가 정확하다.
WHERE JOINED LIKE '2021%'
WHERE JOINED >= '2021-01-01'
AND JOINED < '2022-01-01'
이 방식의 장점:
WHERE YEAR(JOINED) = 2021
WHERE MONTH(JOINED) = 10
주의할 점:
컬럼에 함수를 적용하면 인덱스를 사용하기 어려워질 수 있다.
따라서 대용량 데이터에서는 범위 조건이 더 좋다.
WHERE JOINED BETWEEN '2021-01-01' AND '2021-12-31'
주의:
예:
'2021-12-31 23:59:59'
을 포함하려면 정확히 명시해야 한다.
그래서 실무에서는 보통 다음 방식을 더 많이 사용한다:
JOINED >= '2021-01-01'
AND JOINED < '2022-01-01'
주의점!!!
만약 날짜 리터럴은 반드시 작은따옴표로 감싸지 않으면?
SQL 서버에서는 이를 "계산식"으로 착각한다.
즉 2021 - 1 - 1 = 2019? 로 인식하게 된다.!!
SELECT *
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;
SELECT *
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;
SELECT YEAR(JOINED) AS YEAR, COUNT(*) AS CNT
FROM USER_INFO
GROUP BY YEAR(JOINED);
SELECT MONTH(JOINED) AS MONTH, COUNT(*) AS CNT
FROM USER_INFO
GROUP BY MONTH(JOINED);
날짜 컬럼이 NULL이면:
WHERE JOINED >= '2021-01-01'
조건에서 자동으로 제외된다.
NULL을 포함하고 싶다면:
WHERE JOINED IS NULL
DATE_FORMAT(DATE, '%Y-%m-%d')
| 의미 | MySQL 포맷 |
|---|---|
| 연도 4자리 | %Y |
| 월 2자리 | %m |
| 일 2자리 | %d |
TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD')
| 의미 | Oracle 포맷 |
|---|---|
| 연도 4자리 | YYYY |
| 월 2자리 | MM |
| 일 2자리 | DD |
DATETIME은 문자열이 아니라 "비교 가능한 날짜 타입"이다.
실무에서는 LIKE 대신 범위 비교를 사용한다.