Question

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

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
Était-ce utile?

La solution

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

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

Autres conseils

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 affiché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 d'orientation pour résoudre mes besoins dans le code suivant - que je publie ici pour tous ceux qui ont le même besoin que le mien et qui pourraient tomber sur cette page en cherchant 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 les 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 correspondent à 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'

Rechercher la date ajoutée en BOL

dateadd(yy,-1,getdate())

Le plus lisible, OMI :

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

Lequel:

  1. Obtient la date et l'heure du moment GETDATE() = 27/08/2008 10h23#
  2. Convertit en chaîne au format 101 CONVERTIR(varchar, #27/8/2008 10h23#, 101) = '27/8/2007'
  3. Convertit en datetime CONVERTIR(dateheure, '27/8/2007') = #27/8/2008 00h00#
  4. Soustrait 1 an DATEADD(aa, -1, #8/27/2008 00:00AM#) = #8/27/2007 00:00AM#

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

GETDATE() renvoie la date actuelle et le temps.

Si l'année dernière commence à minuit le jour en cours 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

Les autres suggestions sont bonnes si vous avez "SQL uniquement".

Cependant, je suggère que - si possible - vous calculez la date dans votre programme et l'insérez sous forme de chaîne dans la requête SQL.

Au moins pour les grandes tables (c.-à-d.plusieurs millions de lignes, peut-être combinées avec des jointures) qui vous apporteront une amélioration considérable de la vitesse car l'optimiseur peut bien mieux fonctionner avec cela.

argument pour la fonction DATEADD :

DATEADD (*datepart* , *number* , *date* )

datepart peut être:aa, qq, mm, dy, jj, semaine, dw, hh, mi, ss, ms

nombre est une expression qui peut être résolue en un entier ajouté à une partie de date

date est une expression qui peut être résolue en une valeur d'heure, de date, de smalldatetime, de datetime, de datetime2 ou de 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

J'aime @D.E.White, est venu ici pour des raisons similaires mais différentes de celles de la question initiale.La question initiale porte sur les 365 derniers jours.La réponse de @samjudson le fournit.@D.E.La réponse de White renvoie les résultats de l'année civile précédente.

Ma requête est un peu différente dans la mesure où elle fonctionne pour le année précédente jusqu’à la date du jour inclusivement :

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 1/01/2016 au 17/02/2017.

J'ai eu un problème similaire mais le codeur précédent ne fournissait 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())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top