2009-09-15 2 views
50

MS SQL 2005를 사용하고 있으며 두 날짜의 일치 여부를 확인하고 시간 부분은 무시하고 싶습니다.시간 부분을 무시하고 T-SQL의 날짜 비교

나는 DATEDIFF을 사용할 수 있지만, 느릴 수도 있다는 점을 알고 있습니다.이 SP는 DB에 많이 사용됩니다!

제안 사항?

편집 : 데이비드 안드레스 '코멘트 :

' "비교"제가 충분히 내 질문에 명확하게하지 않았다는 것을 깨닫게했다
'평등보다 훨씬 더 포함 - 실제로 단지 어떤지를 확인하고, 그게 전부입니다 .

+10

조기 최적화에 신경 쓰지 마라. 'DATEDIFF'를 사용하여 쿼리를 작성한 다음 병목 현상이 있는지 또는 쿼리 계획을 검토하지 않는지 확인한다. 그것이 문제라면 대안을 찾으십시오. – Welbog

+0

가능한 복제본 [SQL Server에서 datetime의 시간 부분을 제거하는 최선의 방법] (http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql- 서버) – abatishchev

답변

81

이렇게 유일한 합리적인 방법은 시간 값의 시간 부분을 벗겨 상기 결과 및 날짜에서 시간 부분을 제거하는 가장 좋은 방법을 비교하는 것은 본 같다 :

cast(current_timestamp as date)  

내가 사용하고 다음 두 줄 중 하나처럼 보였다 프로세스 옹호하는 데 사용 :

cast(floor(cast(getdate() as float)) as datetime) 
dateadd(dd,0, datediff(dd,0, getDate())) 

을하지만 지금은 SQL Server가 시간 구성 요소를 보유하지 않는 Date 유형을 가지고, 하나를 사용하는 작은 이유가 그 기술들.

여기에서 유의할 점은 where 절 또는 join 조건의 모든 행에 대해 두 datetime 값에 대해 수행해야하는 경우 여전히 쿼리가 중단 될 수 있다는 것입니다. 가능하다면 어떻게 든 배제하고 싶으므로 뷰 또는 계산 된 열을 사용하여 가능한 한 많이 미리 계산됩니다.

마지막으로 DATEDIFF 함수는 교차 된 경계 수를 비교합니다. 따라서 '2009-09-14 11:59:59''2009-09-15 00:00:01' 사이의 날짜는 2 초만 경과되었지만 '2009-09-15 00:00:01''2009-09-15 11:59:59' 사이의 일의 DATEDIFF는 86,398 초가 경과하더라도 여전히 0입니다. 거기에 시간 부분에 대해서는 전혀 신경 쓰지 않습니다. 귀하의 질의가 무엇을하려고하는지에 따라, 당신은 그것을 당신의 이점으로 사용할 수있을 것입니다. 나는 두 날짜가 동일이라고 결정하고 싶어 내 자신의 작품에서는

+3

그게 덜 효율적 그냥 _DATEDIFF (일, date1, date2)를 사용하는 것보다 _ 않을까? –

+0

편집 작업 중이 었는데 이제 준비되었습니다. –

+2

나는 시간을 없애는 방법을 찾고 있지는 않았지만 시간을 무시한 두 가지 날짜를 비교하는 방법이었다. 이것은 나에게 조금 느린 것 같습니다. –

6

에 관계없이 하루 중 시간, 내가 사용했던 다음을 부여

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

는 "비교"를 포함 평등보다 훨씬 더 위의 예는 비교를하기 전에 날짜를 미국 형식 MM/DD/YYYY로 변환합니다. 따라서 성능에 영향을 미치고 날짜 차이를 비교할 수 없습니다.

하지만 ... 작동합니다.

4

비즈니스 요구 사항 중 하나가 데이터 모델에서 제대로 제공되지 않는 경우 (예 : 날짜를 비교해야하지만 날짜를 추적하지 않고 날짜 만 더하기) 모델을 조정할 가능성을 살펴보고 모델을 다루는 방법을 살펴 보지 마십시오.

인덱싱 된 계산 열에 날짜 전용 만 저장하거나 날짜와 시간 부분을 별도로 저장하는 것이 가능합니까?

33

어디서 DATEDIFF (일, 날짜 1, 날짜 2) = 0

2

늦게 답변드립니다.

내가 항상 최신을 비교 한이 구문을 사용

WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

우리가 yyyyMMdd 형식으로 날짜를 반환 (112) 형식의 코드로 날짜를 변환 할 때마다 항상 잘 작동합니다. 시간이없는 문자열 형식의 날짜를 비교하지만 훌륭하게 작동합니다. 덕분에

+0

당신의 솔루션은 "IF date_column! = GETDATE()"가 작성하지 않은 스크립트에서 작동했습니다. 왜 그런지 알고 있습니까? – CryptoJones