1

特定の月に挿入されたすべての行を取得しようとしています。

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')) 

何か案は?

4

5 に答える 5

3

「特定の月」について言及しましたが、1 から 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

そのように。

(気になる場合に備えて、年を追加しました。:-))

于 2009-02-28T19:10:23.907 に答える
1

その月の開始時点と翌月の開始時点を作成し、開始時点から開始時点までの日付を取得し、次の開始時点までの日付を取得します。

つまり、結果は次のようになります。

Where PostDate >= '01/01/2009' and PostDate < '02/01/2009'

これにより、正確にその月が取得され、翌月に重複することはありません。

DATEDIFF(mm, 0, '2009-01-28')は からの月数を与える01/01/1900ので、その日付を の 3 番目のパラメータとして使用する必要がありますDATEADD

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')
于 2009-02-28T19:08:07.593 に答える
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
于 2009-02-28T18:47:17.800 に答える