2017-05-02 6 views
0

Ich verwende den neuesten SQL Server. Ich habe eine Tabelle mit einer CreatedDate-Spalte. Ich muss eine Abfrage schreiben, die Daten verwendet, die plus oder minus 7 vom Datum in CreatedDate sind. Ich habe keine Ahnung, wie ich das anstellen soll. Mein Gedanke war:Datumsbereich basierend auf Spalte Datum

DECLARE @Date datetime 
DECLARE @SevenBefore datetime 
DECLARE @SevenAfter datetime 
SET @Date = CreatedDate 
SET @SevenBefore = DATEADD(day,-7,@Date) 
SET @SevenAfter = DATEADD(day,7,@Date) 
SELECT * 
FROM <table> 
WHERE <table> BETWEEN @SevenBefore AND @SevenAfter 

Das Problem dabei ist, dass ich nicht „CreatedDate“ als SET @DATE verwenden, da SQL einen Fehler „Ungültige Spaltenname‚CreatedDate‘“ gibt

Jede Hilfe wäre geschätzt. Ich kann kein Datum angeben, da jedes Datum in dieser Spalte unterschiedlich sein kann.

Dank

+0

Woher bekommen Sie das Erstellungsdatum? Wenn Sie den Spaltenwert in einer Tabelle verwenden, warum sollten Sie +/- 7 tun? Kannst du etwas dazu sagen? Ist es in einer anderen Tabelle? – JiggsJedi

+0

Hier ist ein großartiger Ort, um anzufangen. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

Sie Abfrage ergibt nicht einmal Sinn. Ist es 'SELECT * FROM

WHERE
.CreatedDate ZWISCHEN @SevenBefore UND @ SevenAfter' ...? Welches Feld in '
' versuchen Sie auf diesen Zeitraum einzuschränken? – JNevill

Antwort

2

In diesem Fall müssen Sie denken wie ein Programmierer würde stoppen und starten als Datenbank-Programmierer denken würde.

Lets Arbeit nur mit diesem zentralen Teil der Anfrage:

SELECT * 
FROM <table> 
WHERE <table> BETWEEN @SevenBefore AND @SevenAfter 

Nun, sagen Sie, dass die CreatedDate eine Spalte in einer Tabelle sind. In diesem Beispiel nehme ich an, dass das CreatedDate in einer anderen Tabelle als in Ihrem obigen Beispiel vorhanden ist. Zu diesem Zweck werde ich den Tafeln zwei falsche Namen geben. Die Tabelle mit dem CreatedDate, ich werde tblCreated anrufen, und die aus der Abfrage oben werde ich tblData aufrufen.

Oben gesehen, ist es ziemlich offensichtlich, dass Sie eine ganze Tabellenzeile nicht mit einem Datum vergleichen können. In dieser Tabelle muss ein Feld vorhanden sein, das einen Datums-/Uhrzeitwert enthält. Ich werde diese Spalte TargetDate nennen.

SELECT * 
FROM tblCreated tc 
INNER JOIN tblData td 
    ON td.TargetDate BETWEEN DATEADD(day, -7, tc.CreatedDate) and DATEADD(day, 7, tc.CreatedDate) 

Blick auf diese, ist es klar, dass man immer noch zwischen den Tabellen müssen einige andere Verbände:

diese Annahmen gegeben, Ihre Frage etwas aussehen würde. Möchten Sie nur alle Datenzeilen pro Kunde basierend auf dem Erstellungsdatum haben oder möchten Sie vielleicht nur Creations, bei denen etwas daran gearbeitet wurde, wie in den Datensätzen gezeigt, oder ??. Ohne eine umfassendere Spezifikation können wir dabei jedoch nicht helfen.

Verwandte Themen