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)가 빠졌습니다.
•
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 기본원리편


