SQL-Abfrage, um datasätze aus einer Abfrage zu löschen

Ich versuche, 2 Abfragen zu schreiben, um datasätze zu löschen, wo data größer als ein bestimmtes date sind:

Der erste:

delete from RPT_HistSnapEng_temp where ForecastDate> DATEADD(WEEK,7,CAST(GETDATE() AS DATE)) 

Diese Abfrage löscht datasätze, wenn die Prognose größer als 7 Wochen ab heute ist

Die zweite ist:

 delete from RPT_HistSnapEng_temp where ForecastDate< DATEADD(WEEK,-6,CAST(GETDATE() AS DATE)) 

Diese Abfrage löscht datasätze, wenn das Vorhersage weniger als 6 Wochen ab heute ist.

Also grundsätzlich sollte dies die Aufzeichnungen von Dez 2015 – Nov 2016 filtern und nur Aufzeichnungen von früheren 6 Wochen und nächsten 7 Wochen ab heute zeigen.

Obwohl die Abfrage ausgeführt wird, löscht sie keine datasätze. Ich kann die data nicht stören, weil ich diese Abfrage auf einer rollenden Basis in einem SSIS-Paket verwenden werde.

Ihre aktuelle where Klauseln versuchen, Rekorde zu packen, die beide weniger als ein date in der Vergangenheit und größer als ein date in der Zukunft sind. Ich denke, Sie (und die andere Antwort) sollte mit or .

Aber da das aussieht wie eine Temp-Tabelle, die Sie laden, um dann mit zu berichten, würde ich Ihre Einfügung anpassen, um einfach die Aufzeichnungen zu greifen, die Sie suchen, anstatt mehr zu laden, als Sie brauchen und dann löschen.

 select * from RPT_HistSnapEng -- base table name? where cast(ForecastDate as date) between dateadd(week, -6, cast(current_timestamp as date)) and dateadd(week, 7, cast(current_timestamp as date)) 

Fügen Sie einfach Ihre Einfügung hinzu, wenn es die Aufzeichnungen bekommt, die Sie benötigen.

Allerdings, um direkt beantworten Ihre Frage über Löschungen, können Sie diese Abfrage ändern, um einfach NICHT zwischen:

 delete from RPT_HistSnapEng_temp where cast(ForecastDate as date) not between dateadd(week, -6, cast(current_timestamp as date)) and dateadd(week, 7, cast(current_timestamp as date)) 

Wie Sie sehen können, mag ich die Verwendung von between (das ist inklusive der datesargumente) für diese Art von Bereichskontrolle, anstatt sich bei der Verwendung von >= und < oder verwirrend der and und or was du scheinbar getan hast. Ich mag auch die ANSI-Standard current_timestamp über die t-sql spezifischen getdate() aber sie sind gleichwertig.

Versuchen Sie "ww" oder "wk" anstelle von "week" in der dateadd function. Versuchen Sie eine SELECT-statement, um die datasätze zu erhalten, die Sie löschen möchten:

 SELECT ID, ForecastDate FROM RPT_HistSnapEng_temp WHERE CAST(ForecastDate AS DATE) > DATEADD(ww,7,CAST(GETDATE() AS DATE)) OR CAST(ForecastDate AS DATE) < DATEADD(WEEK,-6,CAST(GETDATE() AS DATE)) ORDER BY ForecastDate 

Um zu löschen, entfernen Sie einfach die SELECT und die ORDER BY:

 DELETE FROM RPT_HistSnapEng_temp WHERE CAST(ForecastDate AS DATE) > DATEADD(ww,7,CAST(GETDATE() AS DATE)) OR CAST(ForecastDate AS DATE) < DATEADD(WEEK,-6,CAST(GETDATE() AS DATE))