2009-02-28 5 views
1

특정 달 동안 삽입 된 모든 행을 검색하려고합니다.T-Sql을 사용하여 주어진 달 동안 삽입 된 모든 행을 검색하는 방법

SELECT 
    dbo.Post.UserId, 
    dbo.Post.Tags, 
    dbo.Post.CommentCount, 
    dbo.Post.Status, 
    dbo.Post.PostDate, 
    dbo.Post.[Content], 
    dbo.Post.Title, 
    dbo.Post.PostId, 
    dbo.[User].DisplayName 
FROM 
    dbo.Post INNER JOIN 
    dbo.[User] ON dbo.Post.UserId = dbo.[User].UserId 
Where PostDate >= DATEADD(mm, 0, DATEDIFF(mm, 0, '01/28/2009')) 
    AND PostDate <= DATEADD(mm, 0, DATEDIFF(mm, 0, '01/28/2009')) 

아이디어가 있으십니까?

답변

2
WHERE PostDate >= DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), 0) 
    AND PostDate < DATEADD(mm, 1 + DATEDIFF(mm, 0, '01/28/2009'), 0) 
+0

내가이 일 +1 – dotjoe

0
@dtInput = '01/28/2009' 

-- subtract current days (less one) to get to start of month 
set @dtStart = dateadd(dd, 1 - datepart(dd, @dtInput), @dtInput) 

-- add a month, then subtract 1 sec to get 23:59:59 on last day of month 
set @dtEnd = dateadd(ss, -1, dateadd(mm, 1, @dtStart)) 

SELECT ... WHERE PostDate between @dtStart and @dtEnd 
+0

검사에게 쿼리를 보지 못했다, parenthesises –

1

당신은 시작 순간을 포함하여 다음, 그 달의 시작 순간과 다음 달 시작하는 순간을 만들 수에서 날짜를 가지고 할 때까지하지만 다음 시작 모멘트를 포함하지 않음.

즉, 결과는 다음과 같아야합니다.

이렇게하면 정확하게 그 달을 얻을 수 있으며 다음 달로 중복되지 않습니다.

당신이 DATEADD에서 세 번째 매개 변수로 해당 날짜를 사용해야하므로 DATEDIFF(mm, 0, '2009-01-28')01/01/1900에서 당신에게 달의 수를 줄 것이다 표현 :

DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), '01/01/1900') 

방금 ​​사용하는 다음 달의 시작 순간을 얻으려면 '02/01/1900'을 오프셋으로 사용합니다. 의이 상태에서 그것을 넣어 보자 :

Where 
    PostDate >= DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), '01/01/1900') and 
    PostDate < DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), '02/01/1900') 
+0

와 실수 IMO는 dataadd에서 세 번째 매개 변수로 0을 사용해야있다. datadiff의 두 번째 매개 변수와 일치해야합니다. 그런 다음 '02/01/1900 '을 사용하는 대신 datadiff 결과에 1을 더합니다. – dotjoe

+0

더 나은 것은 두 곳 모두에서 실제 날짜를 사용하는 것입니다. 그런 다음 '01/01/2000 '과 같이 신비한 제로 날짜보다 더 나은 날짜를 사용할 수 있습니다. 두 날짜가 같은 경우 실제로 날짜는 중요하지 않습니다. – Guffa

+0

문자열이 실제 날짜가 아닙니다 ... '2/1/2009'는 jan 일 수 있습니다. 2 위!?! 0은 항상 기본 날짜가됩니다. 캐스트 (0으로 datetime). 그것에 대해 아무것도 신비 없습니다. – dotjoe

3

당신이 날짜로 시작하고 바로 그 달에 속하는 모든 것을 원한다면 당신은 내가 12 일에서 한 달에 번호를 있으리라 믿고있어하는 "특정 달"에 대한 언급 :

@month = datepart(mm, 'given date'); 
@year = datepart(yy, 'given date'); 

Then use: 

Where 
    datepart(mm, Post.Postdate) = @month 
    and datepart(yy, Post.PostDate) = @year 

그런 식으로.

이 그것을 할 것입니다

+0

우리가 올해에 신경 쓰지 않는 경우 유용 할 수 있습니다. –

+0

데이터 볼륨이 적 으면 좋지만 항상 테이블 스캔이므로 볼륨이 높아질수록 느려질 것입니다. 다른 솔루션은 날짜 열의 색인을 활용할 수 있습니다. 볼륨이 높고 색인이 클러스터 된 경우 매우 유용합니다. –

+0

@year는 1 년을 처리합니다. 이 쿼리는 certian 년/월이 당신이 찾고있는 것을 나타냅니다.날짜 범위가 반드시 그 사실을 말해주지는 않습니다. 그러나 나는 그 의견이 올 것이라고 확신한다.) – JeffO

1

을 (난 당신이 :-). 그것에 대해 걱정하는 경우에 올해 추가).

Where PostDate >= DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), 0) 
    AND PostDate < DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009') + 1, 0) 

또한 일반적으로 날짜 절을 쿼리 전에 설정하므로 날짜 함수를 where 절에 넣지 않아도됩니다.

declare @from datetime; 
declare @thru datetime; 

set @from = DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), 0); 
set @thru = DATEADD(mm, 1, @from); 

... 
Where PostDate >= @from 
     AND PostDate < @thru 
관련 문제