쿼리에 시간으로 조건을 줄 때

유석현(SeokHyun Yu)·2022년 7월 13일
1

정보

목록 보기
3/9
post-thumbnail

서론

어느 한 테이블에서 '2022-07-13 00:00:00'부터 '2022-07-13 03:00:00'사이에 생성된 데이터를 조회한다고 가정해보자.

이때 우리는 WHERE 구에 BETWEEN 키워드를 이용하여 조회할 수 있다.

SELECT *
FROM sample_table
WHERE created_at BETWEEN '2022-07-13 00:00:00' AND '2022-07-13 03:00:00'

하지만 여기서 끝난다면 우리가 원하는 데이터를 얻지 못한다.

DB에 데이터가 저장될 때는 대한민국 기준으로 -9시간, 즉 utc(협정 세계시)를 기준으로 저장이 되기 때문이다.

무슨 말인지 잘 이해가 되지 않는다면 상황을 가정하여 한 번 계산해보자.

대한민국 시각이 '2022-07-13 00:00:00'일 때 한 유저가 회원가입을 하였다.

회원가입을 했으니 DB의 테이블에 새로운 데이터가 추가될텐데, 현재 대한민국 시각에서 9시간을 뺀 '2022-07-12 15:00:00'를 기준으로 저장이 되는 것이다.

따라서 이 유저는 실제로 '2022-07-13 00:00:00'에 가입을 했지만, DB상에서는 '2022-07-12 15:00:00'에 가입을 한 것처럼 보이게 되는 것이다.

그럼 우리가 실제로 원하는 시간에 생성된 데이터를 구하고 싶으면 어떻게 해야할까?


해결방법

두 가지 방법이 있다

  • WHERE 조건의 대상이 되는 column9시간을 더해서 계산하는 방법
SELECT COUNT(*)
FROM `point` p 
WHERE DATE_ADD(created_at, INTERVAL 9 HOUR)
BETWEEN '2022-07-13 00:00:00' AND '2022-07-13 03:00:00'

  • WHERE절에 주는 시간 조건에 9시간을 빼주어 계산하는 방법
SELECT COUNT(*)
FROM point
WHERE created_at
BETWEEN '2022-07-12 15:00:00' AND '2022-07-12 18:00:00'

첫 번재 방법에서 column 자체에 9시간을 더해준 이유는 DB에 저장될 때 9시간이 줄어든 상태에서 저장이 되기 때문에 9시간을 더해준 것이고, 두 번재 방법에서 BETWEEN에 주는 시간 조건에 9시간을 빼준 이유는 실제 DB에 저장된 시간이 구하고 싶은 시간보다 9시간 줄어든 상태에서 저장된 데이터이기 때문이다.

둘 중 어느 방법으로 사용해도 상관이 없지만 필자는 column 자체에 9시간을 더해서 대한민국 시간 기준으로 편하게 시간 조건을 거는 것이 훨씬 보기도 좋고 편하게 쿼리를 짤 수 있어 선호한다.

profile
Backend Engineer

2개의 댓글

comment-user-thumbnail
2022년 8월 20일

유용한 정보 퍼가요~

1개의 답글