Wie alle eingefügten Zeilen in einem bestimmten Monat mit T-SQL abrufen
-
11-09-2019 - |
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?
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