如何使用 T-Sql 检索给定月份内所有插入的行
-
11-09-2019 - |
题
我正在尝试检索在特定月份插入的所有行。
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'))
有任何想法吗?
解决方案
WHERE PostDate >= DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), 0)
AND PostDate < DATEADD(mm, 1 + DATEDIFF(mm, 0, '01/28/2009'), 0)
其他提示
您提到一个“给定月份”,我假设,从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
那样。
(我增加了一年你关心的话: - ))
您想要创建该月的开始时刻和下个月的开始时刻,然后获取从该开始时刻开始的日期(包括该开始时刻)以及直到但不包括下一个开始时刻的日期。
IE。结果应等于:
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')
这将做到这一点。
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
@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
不隶属于 StackOverflow