programing

시간 부분을 무시하고 T-SQL의 날짜 비교

telecom 2023. 7. 9. 09:48
반응형

시간 부분을 무시하고 T-SQL의 날짜 비교

MS SQL 2005를 사용하고 있는데, 동일한 날짜가 두 개인지 확인하고 싶은데 시간 부분은 무시합니다.

DATEIFF를 활용할 수 있다는 것은 알지만, 느릴 수 있다는 것이 걱정됩니다 - 이 SP는 DB에서 많이 사용됩니다!

좋은 의견이라도 있나?

편집: 데이비드 안드레스의 논평:

'비교'는 평등 이상의 것을 포함합니다.'
made me realise that I didn't make my question clear enough - I am actually just checking for equality, that is all.

가장 합리적인 방법은 날짜 시간 값의 시간 부분을 제거하고 결과를 비교하는 것이며, 날짜 시간에서 시간 부분을 제거하는 가장 좋은 방법은 다음과 같습니다.

cast(current_timestamp as date)    

저는 다음 두 줄 중 하나처럼 보이는 프로세스를 사용하고 옹호하곤 했습니다.

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

하지만 이제 SQL Server에Date시간 성분을 포함하지 않는 유형은 이러한 기법을 사용할 이유가 거의 없습니다.

또한 where 절 또는 조인 조건의 각 행에 대해 두 개의 날짜/시간 값에 대해 쿼리를 수행해야 하는 경우에도 이 작업을 수행하면 쿼리가 교착 상태가 됩니다.가능하면 뷰나 계산된 열을 사용하여 가능한 한 미리 계산되도록 이 문제를 해결할 수 있습니다.

마지막으로, DATEIFF 함수는 교차된 경계의 수를 비교합니다.이는 날짜 차이(일)를 의미합니다.'2009-09-14 11:59:59'그리고.'2009-09-15 00:00:01'2초밖에 경과하지 않았음에도 불구하고, 1이지만 DATEIFF는 다음 기간(일) 사이에'2009-09-15 00:00:01'그리고.'2009-09-15 11:59:59'86,398초가 경과했음에도 불구하고 여전히 0입니다.그것은 시간적인 부분에 대해서는 전혀 신경쓰지 않고 단지 경계에 대해서만 신경씁니다.쿼리가 수행하려는 작업에 따라 이를 유용하게 사용할 수 있습니다.

WHERE DATEIFF(일, 날짜1, 날짜2)=0

제 작업에서 두 날짜가 하루 중 어느 시간대에 상관없이 동일한지 확인하고자 할 때 다음을 사용했습니다.

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

물론, "비교"는 동등 이상의 것을 포함하며, 위의 내용은 비교하기 전에 날짜를 USA 형식 MM/DD/YYY로 변환합니다.따라서 성능에 영향을 미치고 날짜 차이를 비교할 수 없습니다.

하지만... 효과가 있습니다.

데이터 모델에서 비즈니스 요구사항 중 하나가 제대로 충족되지 않는 경우(예: 날짜를 비교해야 하는 요구사항이 있지만 날짜+시간만 추적하지 않는 경우), 모델을 조정할 수 있는 방법이 아니라 모델을 조정할 수 있는 가능성을 살펴봅니다.

날짜만 인덱싱된 계산 열에 저장할 수 있습니까? 아니면 날짜와 시간 부분을 별도로 저장할 수 있습니까?

답변이 늦어서 죄송합니다.

나는 항상 날짜 비교를 위해 이 구문을 사용합니다.

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

그것은 우리가 112 형식 코드로 날짜를 변환할 때마다 항상 잘 작동합니다. 그것은 날짜를 반환합니다.yyyyMMdd그것은 시간 없이 문자열 형식으로 날짜를 비교하지만 잘 작동합니다.감사해요.

언급URL : https://stackoverflow.com/questions/1427469/compare-dates-in-t-sql-ignoring-the-time-part

반응형