2017-08-29 4 views
2

Ich habe einen Bericht, dass ich jeden Monat ausführen sollte, und wählen Sie Daten vom 21. des gleichen Monats des letzten Jahres bis zum 20. des aktuellen Monats, aktuelles Jahr. dh es ist 29. August jetzt und heute muss ich meinen Bericht ausführen, aber ich möchte, dass nur Daten vom 21.08.2016 bis 20.08.2017 angezeigt werden und wenn ich ihn am September laufe, möchte ich Daten vom 20.09.2016 bis 21.09.2017. ..Wählen Sie bestimmte Daten SQL

ich war mit

Select * 
from invt 
where DATE > (GETDATE()-365) 

aber es ist annähernd, und ich habe Bericht genau am 20. eines jeden Monats laufen.

Irgendeine Idee, wie man es macht? TIA

+0

wahrscheinlich Duplikat https://stackoverflow.com/questions/37575216/where-date- vor einem Jahr und jetzt –

Antwort

2

Sollte funktionieren mit:

SELECT * 
    FROM invt 
WHERE DATE BETWEEN 
     DATEADD(YEAR,-1,DATEADD(DAY,19,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0))) 
    AND DATEADD(DAY,20, DATEADD(MONTH,DATEDIFF(MONTH,0, GETDATE()),0)) 

beängstigend aussieht, aber seine im Grunde einfache Dinge zu tun:

Zum 20. des vergangenen Jahres:

  • Erhalten Sie aktuelle Datum
  • nehmen Sie einfach den Monat (Anfang des Monats)
  • hinzufügen 19 Tage (wir jetzt am 20. des laufenden Monats sind)
  • subtrahieren 1 Jahr

Recht die gleiche Logik für das 21. des laufenden Monats. nur ohne ein Jahr zu subtrahieren.

+0

oh, großartig! Das habe ich gebraucht. Thx für detaillierte Erklärung. – Monika

0

Sie können die 21. des laufenden Monats erhalten mit:

dateadd(day, 21 + 1 - day(getdate()), cast(getdate() as date)) 

Wenn Sie von vor einem Jahr wollen:

where date < dateadd(day, 21 + 1 - day(getdate()), cast(getdate() as date)) and 
     date >= dateadd(year, 1, dateadd(day, 21 + 1 - day(getdate()), cast(getdate() as date))) 
1

Eine weitere Option, wenn 2012+

Where Date between format(DateAdd(YEAR,-1,GetDate()),'yyyy-MM-21') 
       and format(GetDate(),'yyyy-MM-20') 

Die Datum wäre 2016-08-21 and 2017-08-20

+0

Sie sollten die Verwendung der FORMAT-Funktion vermeiden. Es gab ziemlich viele Tests und Performances, die im Vergleich zu CAST oder CONVERT entsetzlich sind. –

+0

@ JasonA.Long Voll und ganz auf die Leistung von Format(). JEDOCH wird dies ONCE nicht Record für Record genannt/gelöst. –

+0

Fair genug ... Aber, wird das OP das nächste Mal wissen, wenn sie dies in einer korrelierten Sub-Query oder Cross anwenden müssen? –

1

Wenn Sie SQL Server 2012 oder höher verwenden, können Sie die DATEFROMPARTS Funktion ...

SELECT 
    * 
FROM 
    dbo.MyTable mt 
WHERE 
    mt.SomeDate >= DATEFROMPARTS(YEAR(GETDATE()) -1, MONTH(GETDATE()), 20); 
0
DECLARE @CurrentDate datetime = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) + 19 
DECLARE @PriorDate datetime = DATEADD(YEAR, -1, @CurrentDate) + 1 

SELECT @CurrentDate, @PriorDate