Frage

Ich schreibe eine Abfrage, bei der ich nur die Daten für das letzte Jahr abrufen muss.Wie geht das am besten?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
War es hilfreich?

Lösung

Folgendes fügt dem aktuellen Datum -1 Jahre hinzu:

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

Andere Tipps

Ich bin auf diese Seite gestoßen, als ich nach einer Lösung gesucht habe, die mir dabei helfen würde, Ergebnisse aus einem früheren Kalenderjahr auszuwählen.Bei den meisten der oben gezeigten Ergebnisse handelt es sich um Rückgabeartikel aus den letzten 365 Tagen, was bei mir nicht funktioniert hat.

Gleichzeitig hat es mir genügend Orientierung gegeben, 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 bei der Suche nach einer Lösung möglicherweise auf diese Seite stoßen.

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 finden, was ich brauchte.

Nun ja, ich glaube, hier fehlt etwas.Der Benutzer möchte Daten vom letzten Jahr und nicht von den letzten 365 Tagen erhalten.Es gibt einen großen Unterschied.Meiner Meinung nach handelt es sich bei den Daten des letzten Jahres um alle Daten aus dem Jahr 2007 (wenn ich mich jetzt im Jahr 2008 befinde).Die richtige Antwort wäre also:

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

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

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

Suchen Sie in BOL nach dateadd

dateadd(yy,-1,getdate())

Das am besten lesbare, meiner Meinung nach:

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

Welche:

  1. Ruft die aktuelle Datums- und Uhrzeitangabe ab GETDATE() = #27.08.2008 10:23#
  2. Konvertiert in eine Zeichenfolge mit Format 101 CONVERT(varchar, #8/27/2008 10:23am#, 101) = '8/27/2007'
  3. Konvertiert in eine Datums-/Uhrzeitangabe CONVERT(datetime, '8/27/2007') = #8/27/2008 00:00#
  4. Subtrahiert 1 Jahr DATEADD(yy, -1, #27.08.2008 00:00 Uhr#) = #27.08.2007 00:00 Uhr#

Es gibt Varianten mit DATEDIFF und DATEADD, die Ihnen Mitternacht des heutigen Tages anzeigen, diese sind jedoch eher unübersichtlich (allerdings etwas besser in der Leistung – was Ihnen im Vergleich zu den Lesevorgängen, die zum Abrufen der Daten erforderlich sind, nicht auffallen würde).

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

Wenn letztes Jahr beginnt um Mitternacht des aktuellen Tages im letzten Jahr (wie im Originalbeispiel). Sie sollten etwas verwenden wie:

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 – wenn möglich - Sie berechnen das Datum in Ihrem Programm und fügen es als String in die SQL-Abfrage ein.

Zumindest für große Tische (z.B.mehrere Millionen Zeilen, möglicherweise kombiniert mit Verknüpfungen), was zu einer erheblichen Geschwindigkeitsverbesserung führt, 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, tt, wk, tw, hh, mi, ss, ms

Nummer ist ein Ausdruck, der in einen Ganzzahlwert aufgelöst werden kann, der zu einem Datumsteil eines 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 mag @D.E.White kam aus ähnlichen, aber anderen Gründen hierher als die ursprüngliche Frage.Die ursprüngliche Frage fragt nach den letzten 365 Tagen.Die Antwort von @samjudson liefert das.@D.E.Die Antwort von White liefert Ergebnisse für das vorangegangene Kalenderjahr.

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

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

Am 17. Februar 2017 gibt diese Abfrage beispielsweise Ergebnisse vom 1.1.2016 bis zum 17.2.2017 zurück

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

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top