Frage

Ich versuche, alle Zeilen in einem bestimmten Monat eingefügt abzurufen.

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

Jede Idee?

War es hilfreich?

Lösung

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

Andere Tipps

Sie sprechen für einen „bestimmten Monat“, ich bin im Monat Zahl von 1 bis 12 unter der Annahme Wenn Sie mit einem Datum beginnen und einfach alles wollen, die in diesem Monat fällt:

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

Then use:

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

so.

(Ich habe das Jahr im Fall, dass Sie darüber Pflege: -.))

Sie mögen das Startmoment des Monats und die Startzeit des nächsten Monats erstellen, nehmen Sie dann die Daten ab einschließlich dem Startmoment, und bis, aber nicht den nächsten Startmoment einschließlich.

d. das Ergebnis sollte äquivalent sein:

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

Das wird Sie erhalten genau in diesem Monat und keine Überschneidungen auf den nächsten Monat.

Der Ausdruck DATEDIFF(mm, 0, '2009-01-28') geben Sie die Anzahl der Monate von 01/01/1900, so können Sie dieses Datum als dritter Parameter im DATEADD verwenden sollte:

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

das Startmoment des nächsten Monats Um Sie verwenden '02/01/1900' nur als ausgeglichen. Lassen Sie uns das in die Lage versetzt:

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

Dies wird es tun.

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

Auch ich in der Regel meines Datumsbereich vor der Abfrage einrichten, damit ich nicht Datumsfunktionen in der where-Klausel setzen.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top