SQL Server: obtenir les données de l'année écoulée uniquement


98

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

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

Réponses:


196

Ce qui suit ajoute -1 an à la date actuelle:

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

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

2
Cela vous renvoie un nombre, pas une date, vous ne pourriez pas alors comparer cela à une date, sans calculer également l'année de cette date. Cela renverrait alors des résultats incorrects pour le 31 décembre 2014 par rapport au 1er janvier 2015 - qui se situent à des années différentes, mais pas à un an d'intervalle ...
samjudson

correct. J'avais besoin de comparer les années par année, donc de 2013 à 2014, par exemple, car les données à venir n'avaient que l'année. Je n'ai pas été clair dans mon commentaire. Merci
PCPGMR

J'ai reçu un message d'erreur lors de l'exécution de cette requête ... "FONCTION DatabaseName.DATEADD n'existe pas" Une suggestion?
Marcello Perri

10

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.


7

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'

Cela aura de très mauvaises performances sur les grandes tables, vous interrogerez en boucle sur chaque enregistrement pour évaluer la valeur de l'année de la date, il serait préférable d'utiliser une plage de dates
Adriaan Davel


4

Le plus lisible, IMO:

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

Lequel:

  1. Obtient le datetime GETDATE () = # 8/27/2008 10:23 am#
  2. Convertit en une chaîne au format 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = '8/27/2007'
  3. Convertit en un CONVERT datetime (datetime, '8/27/2007') = # 8/27/2008 12:00 AM#
  4. Soustrait 1 an DATEADD (aa, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM#

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


2

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

0

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.


2
Ce serait mieux si vous créez une chaîne paramétrée et évitez de placer la valeur dans la chaîne elle-même ...
Adriaan Davel

0

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.


0
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

1
Cela ne répond pas à la question.
Nathan Skerl

De plus, alors que les boucles sont généralement mauvaises pour SQL
StingyJack

0

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


0

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

0

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

ce serait bien si vous pouviez ajouter la version du serveur MSSQL pour laquelle cela fonctionne.
itwasntme
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.