Search

[필수:정합]날짜 검색 종료 경계 오류

BAD: 1 rows(1건 누락)

하루 데이터 조회: 금일 23시 59분 59초까지 조회
SELECT r.refund_req_no ,r.ord_no ,r.req_dtm FROM startdbpg.tr_ord_refund_max r WHERE r.req_dtm BETWEEN '2024-01-01 00:00:00'::TIMESTAMP AND '2024-01-01 23:59:59'::TIMESTAMP ORDER BY r.refund_req_no ;
SQL
복사
SQL 결과 보기
•
끝을 23:59:59로 잡아서, 23:59:59.010에 들어온 2번 데이터(refund_req_no = 2)가 빠졌습니다.
•
이를 피하려고 컬럼을 TO_CHAR로 바꾸면 성능 문제가 생깁니다. → [필수:성능]WHERE 절 컬럼 변형

GOOD: 2 rows(정상)

하루 데이터 조회: 다음날 00시 00분 00초 미만까지 조회
SELECT r.refund_req_no ,r.ord_no ,r.req_dtm FROM startdbpg.tr_ord_refund_max r WHERE r.req_dtm >= '2024-01-01 00:00:00'::TIMESTAMP AND r.req_dtm < '2024-01-01 00:00:00'::TIMESTAMP + interval '1' day ORDER BY r.refund_req_no ;
SQL
복사
SQL 결과 보기
•
시작 시각 이상, 다음 날 00:00 미만으로 조회합니다.
•
소수 초 데이터(23:59:59.010)까지 1월 1일의 2건이 모두 조회됩니다.
💡

KEY POINT

•
날짜·시간 범위는 >= 시작과 < 다음 시작으로 씁니다. 하루라면 다음 날 00:00 미만입니다.
•
끝을 23:59:59로 잡으면 소수 초 데이터가 빠집니다. 23:59:59.999도 안전하지 않습니다.
•
TIMESTAMP 범위에는 BETWEEN을 쓰지 않습니다. 양 끝이 포함되어 경계가 어긋납니다.
✏️

TIP. DATE 컬럼이라면?

•
DATE 자료형(시간 없음) 컬럼이라면 BETWEEN도 결과는 맞습니다.
•
하지만 컬럼 자료형이 나중에 바뀔 수도 있으니, 날짜 범위는 항상 >=와 <로 쓰는 습관을 들입니다.
📖 DEEP DIVE — SQL TUNER for PostgreSQL 기본원리편