Comment récupérer toutes les lignes insérées au cours d'un mois donné en utilisant T-Sql
-
11-09-2019 - |
Question
Je suis en train de récupérer toutes les lignes insérées au cours d'un mois donné.
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'))
? De Toute idée
La solution
WHERE PostDate >= DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), 0)
AND PostDate < DATEADD(mm, 1 + DATEDIFF(mm, 0, '01/28/2009'), 0)
Autres conseils
Vous parlez d'un « donné mois », je suppose un certain nombre de mois de 1 à 12. Si vous commencez avec une date et que vous voulez simplement tout ce qui tombe dans ce mois:
@month = datepart(mm, 'given date');
@year = datepart(yy, 'given date');
Then use:
Where
datepart(mm, Post.Postdate) = @month
and datepart(yy, Post.PostDate) = @year
comme ça.
(j'ai ajouté l'année au cas où vous souciez que: -.))
Vous voulez créer le moment à partir de ce mois et le moment à partir du mois suivant, puis prendre les dates à compter du moment de départ, et jusqu'à, mais sans inclure l'instant de départ.
i.e.. le résultat devrait être équivalent à:
Where PostDate >= '01/01/2009' and PostDate < '02/01/2009'
Cela vous obtenir exactement ce mois et ne se chevauchent sur le mois suivant.
Le DATEDIFF(mm, 0, '2009-01-28')
d'expression vous donnera le nombre de mois de 01/01/1900
, vous devez donc utiliser cette date comme le troisième paramètre dans le DATEADD
:
DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), '01/01/1900')
Pour le moment à partir du mois prochain, vous utilisez juste '02/01/1900'
comme offset. Mettons que, dans la condition:
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')
fera.
Where PostDate >= DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009'), 0)
AND PostDate < DATEADD(mm, DATEDIFF(mm, 0, '01/28/2009') + 1, 0)
En outre, je généralement mis en place ma plage de dates avant que la requête, donc je n'ai pas de mettre les fonctions de date dans la clause 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