서론
어느 한 테이블에서 '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
조건의 대상이 되는 column
에 9
시간을 더해서 계산하는 방법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
시간을 더해서 대한민국 시간 기준으로 편하게 시간 조건을 거는 것이 훨씬 보기도 좋고 편하게 쿼리를 짤 수 있어 선호한다.
유용한 정보 퍼가요~