Как получить все вставленные строки в течение данного месяца, используя T-Sql - PullRequest
1 голос
/ 28 февраля 2009

Я пытаюсь получить все строки, вставленные в течение определенного месяца.

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

Есть идеи?

Ответы [ 5 ]

3 голосов
/ 28 февраля 2009

Вы упоминаете в качестве «данного месяца», я предполагаю номер месяца от 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

вот так.

(я добавил год на случай, если тебя это волнует.: -))

3 голосов
/ 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 голос
/ 01 марта 2009

Это сделает это.

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
1 голос
/ 28 февраля 2009

Вы хотите создать начальный момент этого месяца и начальный момент следующего месяца, затем взять даты, начиная с включающего момента и до, но не включая следующий начальный момент.

т.е. результат должен быть эквивалентен:

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')
0 голосов
/ 28 февраля 2009
@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
...