SQL 공부 - date / datetime / timestamp

정민주·2026년 2월 26일

SQL

목록 보기
2/3

1. DATE vs DATETIME vs TIMESTAMP

타입설명
DATE날짜만 저장 (YYYY-MM-DD)
DATETIME날짜 + 시간 저장 (YYYY-MM-DD HH:MM:SS)
TIMESTAMP날짜 + 시간 저장 (시간대 영향 받음, 시스템 시간 기반)
DATE2021-10-05
DATETIME2021-10-05 14:32:10

2. 날짜 비교의 기본 원리

DATETIME은 문자열처럼 보이지만 실제로는 날짜 타입이다.
따라서 문자열 비교(LIKE)보다 범위 비교가 정확하다.

❌ 잘못된 방식 (문자열처럼 처리)

WHERE JOINED LIKE '2021%'
  • DATE 타입을 문자열처럼 비교
  • 인덱스를 못 탈 가능성 있음
  • 실무에서는 권장되지 않음

✅ 올바른 방식 (범위 비교)

WHERE JOINED >= '2021-01-01'
  AND JOINED <  '2022-01-01'

이 방식의 장점:

  1. 2021년 전체를 정확히 포함
  2. 인덱스 사용 가능
  3. 가장 안정적인 방법

3. 특정 연도/월 추출하기

YEAR 함수

WHERE YEAR(JOINED) = 2021

MONTH 함수

WHERE MONTH(JOINED) = 10

주의할 점:

컬럼에 함수를 적용하면 인덱스를 사용하기 어려워질 수 있다.

따라서 대용량 데이터에서는 범위 조건이 더 좋다.


4. BETWEEN 사용법

날짜 범위 조회

WHERE JOINED BETWEEN '2021-01-01' AND '2021-12-31'

주의:

  • BETWEEN은 양 끝 값을 포함한다.
  • DATETIME 타입이라면 시간까지 고려해야 한다.

예:

'2021-12-31 23:59:59'

을 포함하려면 정확히 명시해야 한다.

그래서 실무에서는 보통 다음 방식을 더 많이 사용한다:

JOINED >= '2021-01-01'
AND JOINED <  '2022-01-01'

주의점!!!

만약 날짜 리터럴은 반드시 작은따옴표로 감싸지 않으면?

SQL 서버에서는 이를 "계산식"으로 착각한다.
즉 2021 - 1 - 1 = 2019? 로 인식하게 된다.!!


5. 가장 빠른 데이터 찾기

가장 오래된 날짜 1개 조회

SELECT *
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;

가장 최신 날짜 1개 조회

SELECT *
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;

6. 집계와 함께 사용하기

연도별 가입자 수

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);

7. NULL과 날짜

날짜 컬럼이 NULL이면:

WHERE JOINED >= '2021-01-01'

조건에서 자동으로 제외된다.

NULL을 포함하고 싶다면:

WHERE JOINED IS NULL

8. 정리

  1. 날짜는 문자열처럼 다루지 않는다.
  2. 특정 연도 조회는 범위 조건이 가장 안전하다.
  3. BETWEEN은 양 끝값을 포함한다.
  4. 함수(YEAR, MONTH)는 편리하지만 인덱스에 불리할 수 있다.
  5. 가장 빠른/늦은 날짜는 ORDER BY + LIMIT 1이 직관적이다.

9. 날짜 데이터 포맷하기

MYSQL

DATE_FORMAT(DATE, '%Y-%m-%d')

의미MySQL 포맷
연도 4자리%Y
월 2자리%m
일 2자리%d

ORACLE

TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD')

의미Oracle 포맷
연도 4자리YYYY
월 2자리MM
일 2자리DD

한 줄 요약

DATETIME은 문자열이 아니라 "비교 가능한 날짜 타입"이다.
실무에서는 LIKE 대신 범위 비교를 사용한다.

0개의 댓글