SQL

시간 조건을 이용하는 SQL WHERE 구문을 쓸 때 주의할 점

gilchris 2016. 10. 19. 23:54

매 1분마다 DB에서 자료를 읽어서 처리를 해야 하는 일이 있다고 하자.

이 때, 쿼리는 대강 다음과 같다.

SELECT * FROM SomeTable WHERE `Date` >=  '1분전' AND `Date` < '지금';

위의 쿼리에서 '1분전'이나 '지금'에 들어갈 시간은 보통 초단위까지 입력하게 된다. 하지만, 초와 초 사이에도 시간은 흐르고 있기 때문에 이런 쿼리에서는 개구간(열린구간), 폐구간(닫힌구간)을 잘 봐야 한다. 다음과 같이 잘못 쓸 수 있기 때문이다.

SELECT * FROM SomeTable WHERE `Date` >  '1분전' AND `Date` <= '지금';

이 경우 얼핏보면 별 문제가 없어보이지만 '지금'에 입력된 시간에서 다음번 실행시 쿼리 실행 후에서 '지금 + 1초' 전까지의 시간에 들어온 자료가 처리되지 않고 빠지게 된다.

예를들면,

SELECT * FROM SomeTable WHERE `Date` >  '2016-10-10 00:00:00' AND `Date` <= '2016-10-10 00:00:01';

이 쿼리가 2016-10-10 00:00:01.500 에 실행이 되었다고 한다면 2016-10-10 00:00:01.501 부터 2016-10-10 00:00:02.000 사이의 자료는 처리되지 않을 것이다.

또한,

SELECT * FROM SomeTable WHERE `Date` BETWEEN '1분전' AND '지금';

이런 쿼리를 써서도 안된다. BETWEEN은 양쪽 모두 폐구간을 의미하므로 위의 BETWEEN 쿼리는 `Date` >=  '1분전' AND `Date` <= '지금' 와 같은 뜻이기 때문에 '지금'에 해당하는 시간에 해당하는 자료들은 중복 처리 된다.


이렇듯 일정 범위에 대한 자료의 처리를 반복적으로 하는 쿼리는 구간을 신경써서 설정해야 찾기 힘든 버그를 피할 수 있다.