개발하다 보면 REG_DT 같은 날짜 컬럼을 기준으로
오늘 등록된 데이터만 조회해야 하는 경우가 있다.
처음에는 DATE()를 사용하는 방법이 가장 간단해 보이는데
BETWEEN이나 >=, <를 이용해서 날짜 범위를 직접 지정하는 방법도 있다.
세 가지 방법이 어떤 차이가 있는지 간단하게 정리해봤다.
테스트 테이블 만들기
먼저 테스트용 테이블을 하나 만들었다.
CREATE TABLE USER_HISTORY (
HISTORY_ID INT NOT NULL AUTO_INCREMENT,
USER_NM VARCHAR(100) NOT NULL,
REG_DT DATETIME NOT NULL,
PRIMARY KEY (HISTORY_ID)
);
날짜 조건을 확인하기 위해
전날, 오늘, 다음 날 데이터를 각각 넣어준다.
INSERT INTO USER_HISTORY (
USER_NM,
REG_DT
)
VALUES
('전날 데이터', CURDATE() - INTERVAL 1 SECOND),
('오늘 오전 데이터', CURDATE() + INTERVAL 9 HOUR),
('오늘 마지막 데이터', CURDATE() + INTERVAL 1 DAY - INTERVAL 1 SECOND),
('내일 데이터', CURDATE() + INTERVAL 1 DAY);
조회해보면 대략 아래와 같은 데이터가 들어간다.

1. DATE()를 이용한 오늘 날짜 조회
가장 간단한 방법은 DATE()를 사용하는 것이다.
SELECT *
FROM USER_HISTORY
WHERE DATE(REG_DT) = CURDATE();
REG_DT가
2026-09-22 09:00:00
이라면
DATE(REG_DT)
결과는
2026-09-22
처럼 날짜 부분만 가져온다.
CURDATE()도 현재 날짜를 반환하기 때문에
두 값을 비교해서 오늘 데이터를 조회할 수 있다.
코드가 짧아서 처음 봤을 때 가장 이해하기 쉬운 방법이다.

2. BETWEEN으로 오늘 날짜 조회
날짜 범위를 조회할 때 BETWEEN도 사용할 수 있다.
예를 들어 아래처럼 작성할 수 있다.
SELECT *
FROM USER_HISTORY
WHERE REG_DT BETWEEN CURDATE()
AND CURDATE() + INTERVAL 1 DAY;
처음 보면
오늘 00시부터 내일 00시까지
조회하니까 오늘 데이터만 나올 것 같아 보인다.
그런데 BETWEEN은 시작값과 끝값을 모두 포함한다.
즉 실제 조건은
오늘 00:00:00 이상
내일 00:00:00 이하
가 된다.
따라서 정확히 내일 00:00:00에 등록된 데이터도 같이 조회된다.
우리 테스트 데이터에서는 내일 데이터까지 결과에 포함된다.

BETWEEN은 끝값도 포함하기 때문에 다음 날 00:00:00 데이터까지 조회된다.
BETWEEN 끝값을 23:59:59로 하면 되지 않을까?
아래처럼 작성할 수도 있다.
SELECT *
FROM USER_HISTORY
WHERE REG_DT BETWEEN CURDATE()
AND CURDATE() + INTERVAL 1 DAY - INTERVAL 1 SECOND;
이 경우
오늘 00:00:00
~
오늘 23:59:59
까지 조회된다.
일반적인 DATETIME이라면 사용할 수 있지만,
컬럼이 소수점 이하 시간까지 저장한다면 조금 애매해질 수 있다.
예를 들어
23:59:59.500000
같은 값이 저장될 수 있다면 23:59:59보다 큰 값이기 때문에 조회에서 빠질 수 있다.
그래서 날짜 범위를 조회할 때는 종료 시간을 직접 맞추기보다
다음 날 00시 미만으로 조회하는 방법이 더 깔끔하다.
3. >= / < 범위 조건으로 조회
내가 가장 자주 사용하는 방법이다.
SELECT *
FROM USER_HISTORY
WHERE REG_DT >= CURDATE()
AND REG_DT < CURDATE() + INTERVAL 1 DAY;
조건을 풀어서 보면
오늘 00:00:00 이상
내일 00:00:00 미만
이다.
여기서 중요한 건 < 를 사용한다는 점이다.
내일 00:00:00은 포함되지 않기 때문에
정확하게 오늘 데이터만 조회할 수 있다.
또한 23:59:59 같은 종료 시간을 직접 계산할 필요도 없다.

세 가지 방법 비교
정리하면 아래와 같다.
| 방법 | 조건 | 특징 |
| DATE() | DATE(REG_DT) = CURDATE() | 가장 간단하고 직관적 |
| BETWEEN | BETWEEN 오늘 AND 내일 | 끝값까지 포함하므로 주의 |
| >= / < | >= 오늘 AND < 내일 | 날짜 범위를 명확하게 표현 가능 |
개인적으로 오늘 날짜 데이터를 조회할 때는
REG_DT >= CURDATE()
AND REG_DT < CURDATE() + INTERVAL 1 DAY
방식을 사용하는 편이 가장 깔끔한 것 같다.
DATE() 방식도 간단하게 사용할 수 있지만,
컬럼에 함수를 적용하는 형태라는 점은 알아두면 좋다.
MariaDB 버전이나 인덱스 구성에 따라 실행 계획은 달라질 수 있기 때문에
성능이 중요한 쿼리라면 EXPLAIN으로 직접 확인하는 게 가장 정확하다.
정리
오늘 날짜 데이터를 조회하는 방법은 여러 가지가 있다.
가장 간단하게는
DATE(REG_DT) = CURDATE()
를 사용할 수 있다.
BETWEEN도 범위 조회에 사용할 수 있지만
양쪽 끝값을 모두 포함한다는 점을 주의해야 한다.
그래서 오늘 하루를 정확하게 표현하려면
REG_DT >= CURDATE()
AND REG_DT < CURDATE() + INTERVAL 1 DAY
처럼
오늘 00시 이상 ~ 내일 00시 미만
조건으로 작성하는 방법이 편하다.
'개발지식 > DB' 카테고리의 다른 글
| [DBeaver] localhost에서 MariaDB 데이터베이스 생성하기 (0) | 2026.09.21 |
|---|---|
| [MariaDB] Windows에 MariaDB Server 설치하기 (0) | 2026.09.20 |
| [데이터베이스/DB] JOIN이란? (종류, 정리) (0) | 2023.09.07 |
| [데이터베이스/DB] SELECT문의 실행 순서 (0) | 2023.09.06 |
| [데이터베이스/DB] DDL, DML, DCL, TCL이란? (의의, 종류) (0) | 2023.09.03 |
