Antworten:
Folgendes erhöht das aktuelle Datum um -1 Jahre:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
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.
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'
Das am besten lesbare, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Welche:
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).
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
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.
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.
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
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
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())
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()