2013-03-22 3 views
-3

나는 실행중인 쿼리가 있고 두 열을 비교할 때 시간이 아닌 날짜 만 고려하려고합니다. 현재 다음을 보유하고 있습니다.datetime 열에서 시간을 제거하는 방법

분명히 동일한 날짜에 각 방문이 같은 시간에 있었던 행만 표시됩니다. 두 컬럼 모두 같은 날짜에 항목이 있는지 알고 싶습니다.

+0

은 dvisit a timestamp입니까? –

+0

이 질문은 꽤 철저하게 답이 여기있다 : http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server –

답변

-3

당신은 날에게 NVARCHAR를 만들기 위해 변환을 사용하여 다음과 같이 비교를 할 수있는 : 당신의 where 절에

SELECT dtvisit1, dtvisit2 
FROM Visit 
WHERE CONVERT(nvarchar(20), [dtvisit1], 101) = CONVERT(nvarchar(20), [dtvisit2], 101) 
+5

변환 날짜를 문자열에 적용하는 것은 일반적으로 꽤 끔찍한 생각입니다. – JNK

-2

를 사용하여 변환() 함수를. 두 번 동일한 형식을 사용해야합니다.

8

가장 효율적인 방법은, dtvisit1에 대한 인덱스는 아마 될 것입니다있는 경우 : 다음 주위를 교환 dtvisit2에 인덱스가

WHERE dtvisit1 >= DATEDIFF(DAY, 0, dtvisit2) 
    AND dtvisit1 < DATEDIFF(DAY, -1, dtvisit2) 

합니다. 이렇게하면 한 쪽에서 색인을 적어도 사용할 수 있습니다. 색인이없는 경우 문자열로 변환하는 것과 같은 다른 방법을 사용할 수 있습니다. 단 하나 또는 두 개의 열에 색인을 추가 한 후에도 나중에 전체 스캔을해야 할 위험이 있습니다. 문자열 방식으로 변환하는 것은 대부분의 사람들에게는 무의식적 인 반응이지만, I demonstrate in this blog post why that is the last thing you want to do 인 것 같습니다.

또한 같은 계산 된 열을 추가하는 것이 좋습니다 :

ALTER TABLE dbo.Visit 
    ADD visit1c AS (DATEDIFF(DAY, 0, dtvisit1)); 

ALTER TABLE dbo.Visit 
    ADD visit2c AS (DATEDIFF(DAY, 0, dtvisit2)); 

그럼 그냥 WHERE visit1c = visit2c을 말할 수 있습니다. 심지어 더 간단합니다 :

ALTER TABLE dbo.Visit 
    ADD visitc AS (DATEDIFF(DAY, dtvisit1, dtvisit2)); 

그러면 WHERE visitc = 0 수 있습니다.

지속성 및 색인 생성을 조사하고 싶을 수 있습니다.

SQL Server 2008에서는 sargability를 잃지 않고 양쪽을 DATE으로 간단히 변환 할 수 있습니다.

+0

이 논리는 datetime 필드에서 시간을 제거하는 방법으로 계속 표시되지만 DATEADD (day, 0, getdate())를 선택하면 시간 구성 요소가 생깁니다. 내가 뭘 놓치고 있니? –

+1

@Dan 당신은'DATEADD'가 아니라'DATEDIFF'를 사용한다는 것을 알게 될 것입니다. 'SELECT DATEADD (DAY, DATEDIFF (DAY, 0, GETDATE()), 0);'시도해보십시오. 계산 된 열 위에는 일 경계를 넘은 정수를 나타내는 열이 있습니다. 그리고'WHERE' 절은 암시 적 변환을 수행합니다. 'DECLARE @d DATETIME = DATEDIFF (DAY, 0, GETDATE());를 시도하십시오. SELECT @d;'. –

+0

나는 그 쿼리를 실행했을 때 정수를보고 혼란스러워했다. 너는 나를 용서해야 할거야, 나는 매우 쉽게 혼란스러워. –

관련 문제