112 votes

SQL Server : Obtenir des données uniquement pour l'année écoulée

J'écris une requête dans laquelle je dois obtenir les données pour la dernière année seulement. Quelle est la meilleure façon de procéder ?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'

218voto

samjudson Points 27483

Ce qui suit ajoute -1 année à la date actuelle :

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

1 votes

Le vôtre est plus propre mais voici ce que j'avais : ANNÉE(GETDATE()) - 1

2 votes

Cela vous renvoie un nombre, pas une date, vous ne pourriez pas ensuite le comparer à une date, sans calculer également l'année de cette date. Vous obtiendriez alors des résultats incorrects pour le 31 décembre 2014 et le 1er janvier 2015, qui se situent dans des années différentes, mais pas à une année d'écart...

0 votes

Correct. J'avais besoin de comparer les années par numéro d'année, donc de 2013 à 2014 par exemple, car les données entrantes ne comportaient que l'année. Je n'ai pas été clair dans mon commentaire. Je vous remercie.

11voto

D.E. White Points 11

J'ai trouvé cette page en cherchant une solution qui me permettrait de sélectionner les résultats d'une année civile antérieure. La plupart des résultats affichés ci-dessus semblent renvoyer des éléments des 365 derniers jours, ce qui ne me convenait pas.

En même temps, il m'a donné suffisamment d'indications pour répondre à mes besoins dans le code suivant - que je publie ici pour tous ceux qui ont le même besoin que moi et qui pourraient tomber sur cette page en cherchant une solution.

SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))

Merci aux personnes ci-dessus dont les solutions m'ont permis d'arriver à ce dont j'avais besoin.

5voto

SQLMenace Points 68670

Recherchez dateadd dans BOL

dateadd(yy,-1,getdate())

4voto

Mark Brackett Points 46824

Le plus lisible, IMO :

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

Lequel :

  1. Obtient l'heure de la date actuelle GETDATE() = #8/27/2008 10:23am#
  2. Convertit en une chaîne de caractères avec le format 101 CONVERT(varchar, #8/27/2008 10:23am#, 101) = "8/27/2007
  3. Convertit en une date CONVERT(datetime, '8/27/2007') = #8/27/2008 12:00AM#
  4. Soustrait 1 an DATEADD(yy, -1, #8/27/2008 12:00AM#) = #8/27/2007 12:00AM#

Il existe des variantes avec DATEDIFF et DATEADD pour obtenir le minuit d'aujourd'hui, mais elles ont tendance à être plutôt obtuses (bien qu'elles soient légèrement meilleures en termes de performances - ce que vous ne remarquerez pas par rapport aux lectures nécessaires pour récupérer les données).

2voto

Grzegorz Gierlik Points 6465

GETDATE() renvoie la date actuelle et le temps .

Si l'année dernière commence à minuit du jour actuel de l'année dernière (comme dans l'exemple original), 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X