SQL Server: Daten nur für das vergangene Jahr abrufen


98

Ich schreibe eine Abfrage, in der ich die Daten nur für das letzte Jahr abrufen muss. Was ist der beste Weg, dies zu tun?

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

Antworten:


196

Folgendes erhöht das aktuelle Datum um -1 Jahre:

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

1
Ihre ist sauberer, aber hier ist, was ich hatte: JAHR (GETDATE ()) - 1
PCPGMR

2
Das gibt Ihnen eine Zahl zurück, kein Datum. Sie können das dann nicht mit einem Datum vergleichen, ohne auch das Jahr dieses Datums zu berechnen. Dies würde dann falsche Ergebnisse für den 31. Dezember 2014 gegenüber dem 1. Januar 2015 zurückgeben - die in verschiedenen Jahren liegen, aber nicht ein Jahr auseinander liegen ...
samjudson

richtig. Ich musste die Anzahl der Jahre nach Jahr vergleichen, also zum Beispiel 2013 bis 2014, da die eingehenden Daten nur das Jahr hatten. Ich war in meinem Kommentar nicht klar. Vielen Dank
PCPGMR

Ich habe eine Fehlermeldung erhalten, in der diese Abfrage ausgeführt wird ... "FUNCTION DatabaseName.DATEADD existiert nicht" Irgendwelche Vorschläge?
Marcello Perri

10

Ich habe diese Seite gefunden, als ich nach einer Lösung gesucht habe, mit der ich Ergebnisse aus einem früheren Kalenderjahr auswählen kann. Die meisten der oben gezeigten Ergebnisse scheinen Artikel aus den letzten 365 Tagen zurückzugeben, was bei mir nicht funktioniert hat.

Gleichzeitig gab es mir genug Anweisungen, um meine Bedürfnisse im folgenden Code zu lösen - den ich hier für alle anderen poste, die die gleichen Bedürfnisse wie ich haben und auf diese Seite bei der Suche nach einer Lösung stoßen könnten.

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

Vielen Dank an die oben genannten, deren Lösungen mir geholfen haben, das zu erreichen, was ich brauchte.


7

Nun, ich denke hier fehlt etwas. Der Benutzer möchte Daten aus dem letzten Jahr und nicht aus den letzten 365 Tagen erhalten. Es gibt einen großen Unterschied. Meiner Meinung nach sind Daten aus dem letzten Jahr alle Daten aus dem Jahr 2007 (wenn ich jetzt im Jahr 2008 bin). Die richtige Antwort wäre also:

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1

Wenn Sie diese Abfrage einschränken möchten, können Sie einen anderen Filter hinzufügen, der jedoch immer im letzten Jahr sucht.

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'

Dies hat eine sehr schlechte Leistung bei großen Tabellen.
Adriaan Davel,


4

Das am besten lesbare, IMO:

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

Welche:

  1. Ruft jetzt die Datumszeit ab. GETDATE () = # 8/27/2008 10:23 am#
  2. Konvertiert in eine Zeichenfolge mit dem Format 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = '27.08.2007'
  3. Konvertiert in ein Datum / Uhrzeit- KONVERTIERUNG (Datum / Uhrzeit, '08 / 2007/2007 ') = # 8/27/2008 00:00 AM#
  4. Subtrahiert 1 Jahr DATEADD (JJ, -1, # 8/27/2008 00:00 AM#) = # 8/27/2007 12:00 AM#

Es gibt Varianten mit DATEDIFF und DATEADD, mit denen Sie heute Mitternacht erreichen können, aber sie sind eher stumpf (obwohl sie etwas leistungsfähiger sind - nicht, dass Sie es im Vergleich zu den zum Abrufen der Daten erforderlichen Lesevorgängen bemerken würden).


2

GETDATE () gibt das aktuelle Datum und die aktuelle Uhrzeit zurück .

Wenn das letzte Jahr um Mitternacht des aktuellen Tages im letzten Jahr beginnt (wie im ursprünglichen Beispiel), sollten Sie Folgendes verwenden:

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

Die anderen Vorschläge sind gut, wenn Sie "nur SQL" haben.

Ich schlage jedoch vor, dass Sie - wenn möglich - das Datum in Ihrem Programm berechnen und es als Zeichenfolge in die SQL-Abfrage einfügen.

Zumindest für große Tabellen (dh mehrere Millionen Zeilen, möglicherweise kombiniert mit Verknüpfungen), die eine erhebliche Geschwindigkeitsverbesserung bewirken, da der Optimierer damit viel besser arbeiten kann.


2
Es wäre besser, wenn Sie eine parametrisierte Zeichenfolge erstellen und vermeiden, den Wert in die Zeichenfolge selbst zu setzen ...
Adriaan Davel

0

Argument für die DATEADD-Funktion:

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

Datumsteil kann sein: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms

number ist ein Ausdruck, der in ein int aufgelöst werden kann, das einem Datumsteil des Datums hinzugefügt wird

Datum ist ein Ausdruck, der in einen Zeit-, Datums-, Smalldatetime-, Datetime-, Datetime2- oder Datetimeoffset-Wert aufgelöst werden kann.


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
Dies geht nicht auf die Frage ein.
Nathan Skerl

Auch während Schleifen im Allgemeinen schlecht für SQL sind
StingyJack

0

Ich bin wie @DE White aus ähnlichen, aber anderen Gründen als die ursprüngliche Frage hierher gekommen. Die ursprüngliche Frage betrifft die letzten 365 Tage. @ samjudsons Antwort liefert das. Die Antwort von @DE White gibt Ergebnisse für das vorherige Kalenderjahr zurück.

Meine Abfrage ist insofern etwas anders, als sie für das Vorjahr bis einschließlich des aktuellen Datums funktioniert :

SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))

Beispielsweise gibt diese Abfrage am 17. Februar 2017 Ergebnisse vom 1.1.2016 bis 17.02.2017 zurück


0

Ich hatte ein ähnliches Problem, aber der vorherige Codierer gab das Datum nur im Format MM-JJJJ an. Meine Lösung ist einfach, könnte sich aber für einige als hilfreich erweisen (ich wollte auch sicherstellen, dass Anfangs- und Endräume entfernt wurden):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())

0

Aus irgendeinem Grund hat keines der oben genannten Ergebnisse für mich funktioniert.

Dies wählt die letzten 365 Tage aus.

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

wäre gut, wenn Sie die Version des MSSQL-Servers hinzufügen könnten, für die dies funktioniert.
Es war nicht der
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.