2013-10-17 6 views
8

Ich verwende die folgende SQL-Abfrage, um die Daten aus einer Tabelle für die letzten 7 Tage zu erhalten.SQL-Ausgabe, um nur die letzten 7 Tage Ausgabe bei der Verwendung von konvertieren am Datum zu erhalten

SELECT * 
FROM emp 
WHERE date >= (SELECT CONVERT (VARCHAR(10), Getdate() - 6, 101)) 
     AND date <= (SELECT CONVERT (VARCHAR(10), Getdate(), 101)) 
ORDER BY date 

Die Daten in der Tabelle enthalten auch die Daten des letzten Jahres. Ich will nicht die Ausgabe von 2012 Jahr

Problem ist, ich bin die Ausgabe mit Datum Spalt als

10/11/2013 
10/12/2012 
10/12/2013 
10/13/2012 
10/13/2013 
10/14/2012 
10/14/2013 
10/15/2012 
10/15/2013 
10/16/2012 
10/16/2013 
10/17/2012 
10/17/2013 

bekommen. Bitte schlagen Sie vor, wie Sie die Abfrage ändern können, um die Daten für die letzten 7 Tage dieses Jahres zu erhalten.

+0

Wie ist die Datenstruktur dieser Tabelle? –

+0

Ich habe eine einfache SQLFiddle erstellt, ich kann Ihre Ergebnisse nicht reproduzieren. Was vermisse ich? http://sqlfiddle.com/#!6/5d1e4/3 – Andrew

+0

Ich glaube nicht, dass Sie die AND-Anweisung benötigen, wenn das Datum mehr als oder gleich heute - 6 ist, dann wird das immer genug sein. Es sei denn natürlich, Sie können dies mit zukünftigen Daten bevölkert sein ... –

Antwort

9

Statt ein date zu einem varchar umzuwandeln und ein varchar gegen ein varchar zu vergleichen. Konvertieren Sie die varchar in eine datetime und vergleichen Sie dann diesen Weg.

SELECT 
    * 
FROM 
    emp 
WHERE 
    convert(datetime, date, 101) BETWEEN (Getdate() - 6) AND Getdate() 
ORDER BY 
    date 
5

Warum in Varchar konvertieren, wenn Daten verarbeitet werden? Versuchen Sie stattdessen:

DECLARE @Now DATETIME = GETDATE(); 
DECLARE @7DaysAgo DATETIME = DATEADD(day,-7,@Now); 

SELECT * 
FROM emp 
WHERE date BETWEEN @7DaysAgo AND @Now 
ORDER BY date 
+0

Ich löschte meine Antwort, weil Sie das Gleiche getan haben. @ 7DaysAgo sollte "-7" sein. Und verwenden Sie "Tag" statt "d", um es klarer zu machen. – Kaf

+0

@mayabelle Ich denke, der Grund, warum das OP 'VARCHAR's vergleicht, ist, weil sie ein Datum als' VARCHAR' speichern, weshalb er beim Vergleichen ungültige Daten erhält. –

+0

@Kaf Danke, das war ein Tippfehler. Jetzt behoben. – mayabelle

0

Verwenden Sie dies einfach.

Select columnname 
     from tablename 
      WHERE datecolumn> dateadd(day,-7,GETDATE()) 
Verwandte Themen