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
 WHERE PostDate >=  DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), 0)
   AND PostDate <  DATEADD(mm, 1 + DATEDIFF(mm, 0, '01/28/2009'), 0)
于 2009-02-28T18:37:41.503 回答
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,因此您应该使用该日期作为 中的第三个参数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 回答
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
于 2009-02-28T22:16:36.690 回答
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 回答