Datetime 필드에 index가 걸려 있을 경우, 해당 날의 모든 데이터를 가져오는 쿼리를 할 때
기본적으로 WHERE절에 '2010-08-25' 라고 비교하면 MS-SQL이 자동으로 TYPE CAST를 합니다.
그리고, 아래와 같이 왼쪽값을 변형하면 INDEX를 사용하지 못합니다.
틀린 쿼리 : select * from testtable where convert(datetime, rdate, 112) = '20100825'
올바른 쿼리 : select * from testtable where rdate between convert(datetime, '2010-08-25 00:00:00.000') and convert(datetime, '2010-08-25 23:59:59.997')
마지막 convert(datetime, '2010-08-25 23:59:59.997') 이라고 조건을 명시한 것은 밀리세컨드 단위에서 .999는 .998은 경우에 따라서 다음날로 넘어가는 일이 발생합니다.
이유는 오차버그가 아니고 MSSQL의 DATETIME의 경우 정확도가 3.33밀리초이고 SMALLDATETIME은 1분이기 때문입니다.
2008에서부터는 DATETIME2 자료형이 새로 나왔고 이 자료형의 정확도가 100나노초 이기 때문에 23:59:59.9999999 까지 표현 가능합니다. 2008에서라도 DATETIME이면 .999 .998의 경우 다음날로 넘어갑니다.
'개발' 카테고리의 다른 글
[DB] DECLARE CURSOR(Transact-SQL) (0) | 2010.08.30 |
---|---|
닷넷 시장이 점점 줄어드는 이유 (0) | 2010.08.26 |
[DB] UPDATE SELECT 사용 예시 (0) | 2010.08.19 |
[DB] OPENQUERY(Transact-SQL) (0) | 2010.08.19 |
HTML5의 모든 것 (0) | 2010.08.19 |