mssql where 조건절 튜닝 질문 드립니다. 0 5 1,806

by oratong [2017.01.04 12:39:21]


안녕하세요 

mssql 튜닝문의를 받았는데 where절의 좌변이 가공되어 인덱스를 못타는거 같습니다.

------------------------------------------------------------------------------------------

where conver(varchar(20), date_col, 112) >= concat('2016', '12', '01')

and   conver(varchar(20), date_col, 112) <= concat('2016', '12', '31')

------------------------------------------------------------------------------------------

date_col : date 타입 컬럼

('2016', '12', '01') : 변수로입력 받음.

-- where절을 어떻게 변경해야 인덱스를 탈수 있을까요.

조언 부탁 드립니다...

 

by jkson [2017.01.04 13:25:11]

mssql 구문은 잘 모르지만..

where date_col >= '2016-12-01'
and date_col < '2017-01-01'

이렇게 하면 안 되나요?


by 마농 [2017.01.04 13:47:43]

jkson 님 답변처럼 문자열로 조건 주시면 날짜형으로 자동변환되어 비교됩니다.
명시적으로 변환하고 자 한다면? 다음과 같이
 - CAST('20161201' AS DATE)
 - CONVERT(DATE, '20161201', 112)


by oratong [2017.01.04 13:51:15]

where date_col >= convert(datetime, concat('2016', '12', '01'), 0)

and   date_col <= convert(datetime, concat('2016', '12', '31'), 0)

혹은

where date_col between convert(datetime, concat('2016', '12', '01'), 0)

and   date_col <= convert(datetime, concat('2016', '12', '31'), 0)

자답일지 모르지만.. 이 맞는거 아닐까 합니다.


by oratong [2017.01.04 13:53:03]

date_col 컬럼의 데이터가 2016-12-31 17:09:31:253 의 형태일 경우는 datetime 으로 변경 해야 하나요?

혹은 date로만 해도 될까요.

 


by 마농 [2017.01.04 13:56:41]

종료일의 경우 12월31일을 그대로 사용하여 비교하면

0시0분0초 자료만 포함되고 그 이후 하루종일 자료가 누락됩니다.

23시59분59.999초 까지 이퀄비교(<=) 하거나

아예 다음날 0시 기준으로 부등호비교(<) 해야 합니다.

시분초까지 저장되어 있다면 DateTime 형으로 변환하는게 맞을 듯.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입