Réponses:
Ce qui suit ajoute -1 an à la date actuelle:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
J'ai trouvé cette page en cherchant une solution qui m'aiderait à sélectionner les résultats d'une année civile précédente. La plupart des résultats indiqués ci-dessus semblent renvoyer des articles des 365 derniers jours, ce qui n'a pas fonctionné pour moi.
En même temps, cela m'a donné suffisamment de directives pour résoudre mes besoins dans le code suivant - que je poste ici pour tous les autres qui ont le même besoin que le mien et qui peuvent rencontrer cette page à la recherche d'une solution.
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
Merci à ceux ci-dessus dont les solutions m'ont aidé à arriver à ce dont j'avais besoin.
Eh bien, je pense qu'il manque quelque chose ici. L'utilisateur souhaite obtenir des données de l'année dernière et non des 365 derniers jours. Il y a une énorme différence. À mon avis, les données de l'année dernière sont toutes les données de 2007 (si je suis en 2008 maintenant). La bonne réponse serait donc:
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
Ensuite, si vous souhaitez restreindre cette requête, vous pouvez ajouter un autre filtre, mais en recherchant toujours l'année dernière.
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
Le plus lisible, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Lequel:
Il existe des variantes avec DATEDIFF et DATEADD pour vous obtenir à minuit d'aujourd'hui, mais elles ont tendance à être plutôt obtuses (bien que légèrement meilleures en termes de performances - pas que vous remarquiez par rapport aux lectures nécessaires pour récupérer les données).
GETDATE () renvoie la date et l'heure actuelles .
Si l'année dernière commence à minuit du jour en cours l'année dernière (comme dans l'exemple d'origine), vous devez utiliser quelque chose comme:
DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) -- getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start
Les autres suggestions sont bonnes si vous avez "SQL uniquement".
Cependant, je suggère, si possible , de calculer la date dans votre programme et de l'insérer sous forme de chaîne dans la requête SQL.
Au moins pour les grandes tables (c'est-à-dire plusieurs millions de lignes, peut-être combinées avec des jointures), cela vous donnera une amélioration considérable de la vitesse car l'optimiseur peut fonctionner beaucoup mieux avec cela.
argument pour la fonction DATEADD:
DATEADD (*datepart* , *number* , *date* )
datepart peut être: aa, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
nombre est une expression qui peut être résolue en un entier qui est ajouté à une partie de date de date
date est une expression qui peut être résolue en une valeur time, date, smalldatetime, datetime, datetime2 ou datetimeoffset.
declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
select @sYear + @sMonth
set @iMonth = @iMonth - 1
end
Comme @DE White, je suis venu ici pour des raisons similaires mais différentes de celles de la question initiale. La question d'origine concerne les 365 derniers jours. La réponse de @ samjudson fournit cela. La réponse de @DE White renvoie les résultats de l'année civile précédente.
Ma requête est un peu différente en ce qu'elle fonctionne pour l' année précédente jusqu'à la date actuelle incluse:
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
Par exemple, le 17 février 2017, cette requête renvoie les résultats du 01/01/2016 au 17/02/2017
J'ai eu un problème similaire, mais le codeur précédent n'a fourni que la date au format mm-aaaa. Ma solution est simple mais pourrait s'avérer utile à certains (je voulais aussi m'assurer que les espaces de début et de fin étaient éliminés):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())
Pour une raison quelconque, aucun des résultats ci-dessus n'a fonctionné pour moi.
Cela sélectionne les 365 derniers jours.
SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()