2017-11-27 3 views
-1

타사 Microsoft SQL Server 데이터베이스에서 대부분의 날짜가 varchar 열 형식으로 저장되는 yyyy_MM_dd hh:mm:ss.SSS 열로 작업하고 있습니다. 많은 보고서에서 두 datetime 변수로 정의 된 특정 시간 프레임을 선택해야합니다. 다음 문을 사용하고 있습니다.datetime을 varchar와 비교하는 가장 효율적인 방법

where cast(replace(a.somedate,'_','-') as datetime) between @begin and @end 

많은 성격의 레코드를 처리해야 할 때 쿼리가 비싸게 빨라졌습니다. varchar와 datetime을 비교하는 가장 효율적인 방법은 무엇입니까?

+5

날짜를 올바르게 저장할 수 있도록 데이터베이스를 수정할 수 없습니까? – DavidG

+0

나는 @DavidG에 동의하며,이 문제를 근원지에서 해결할 수 있다면 장기적으로 갈 수있는 가장 좋은 방법 일 것입니다. –

+1

지속 된 계산 된 필드는 어떻게 생성합니까? 데이터베이스를 공급하는 시스템이 여전히 실행중인 경우? – Monah

답변

0

이것은 공급 업체 응용 프로그램이므로 스키마를 제어 할 수 없으므로 WHERE clause을 sargable 표현식으로 리팩토링 할 수 있습니다. 이렇게하면 somedateas의 색인을 효율적으로 사용할 수 있습니다. 예 :

WHERE a.somedateas BETWEEN REPLACE(CONVERT(varchar(19), @begin, 120), '-', '_') AND REPLACE(CONVERT(varchar(19), @end, 120), '-', '_') 
+0

고마워, 내가 그 일을 끝냈다. 단, 전체 datetime을 얻으려면 varchar (23)를 사용했습니다. – user3249829

관련 문제