Wie frage ich in SQL Server nach allen Daten, die größer als ein bestimmtes Datum sind?

338

Ich versuche:

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= 2010-04-01;

A.Date sieht aus wie: 2010-03-04 00:00:00.000

Dies funktioniert jedoch nicht.

Kann jemand eine Referenz dafür geben, warum?

Eric Francis
quelle
17
Setzen
2
Zusätzlich zu Anführungszeichen empfehle ich, immer nur ein sicheres und eindeutiges Format für Nur-Datum-Zeichenfolgenliterale zu verwenden. Der einzige, dem ich vertraue, ist JJJJMMTT. Siehe meinen Kommentar zu Davids Antwort aus dem Grund, warum ...
Aaron Bertrand

Antworten:

486
select *  
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01' )

Wird in Ihrer Abfrage 2010-4-01als mathematischer Ausdruck behandelt , lautet er also im Wesentlichen

select *  
from dbo.March2010 A 
where A.Date >= 2005; 

( 2010 minus 4 minus 1 is 2005 Wenn Sie es in ein richtiges Format konvertieren datetimeund einfache Anführungszeichen verwenden, wird dieses Problem behoben.)

Technisch gesehen können Sie mit dem Parser möglicherweise davonkommen

select *  
from dbo.March2010 A 
where A.Date >= '2010-04-01'

Es wird die Konvertierung für Sie durchführen, aber meiner Meinung nach ist es weniger lesbar als die explizite Konvertierung in ein DateTimeProgramm für den Wartungsprogrammierer, das nach Ihnen kommt.

David
quelle
37
Die explizite Konvertierung ist nicht erforderlich. Außerdem empfehle ich dringend, JJJJMMTT anstelle von JJJJ-MM-TT zu verwenden. Warum? Probieren Sie Ihren Code mit SET LANGUAGE FRENCH. :-) Für dieses Datum erhalten Sie den 4. Januar anstelle des 1. April. Für andere Daten wird möglicherweise stattdessen eine Fehlermeldung angezeigt.
Aaron Bertrand
4
@Aaron Bertrant - Meine Antwort beinhaltete, dass die Konvertierung nicht erforderlich ist, beginnend mit "Technisch gesehen könnte der Pareser Sie mit <endgültigem Codebeispiel> davonkommen lassen. Ich finde es einfach besser lesbar, weil es auffallend offensichtlich ist, dass dies eine ist." Datum-Uhrzeit. Zu viele Datenbanksysteme speichern Datumswerte in einem Varchar-Feld, aber Sie haben Recht mit dem Format. Normalerweise füge ich bei Verwendung der Konvertierung auch den Formatbezeichner hinzu, aber ich habe mein Beispiel von oben ausgeführt Kopf.
David
1
@AaronBertrand, ich musste Ihren Vorschlag in Verbindung mit der obigen Antwort verwenden: CONVERT(datetime, '20100401 10:01:01')- Das Bestehen des 01.04.2010 funktioniert in SQL Server Management Studio, jedoch nicht beim Senden der SQL-Anweisung über PHP / MSSQL.
Büroklammer
Ich denke, es ist klar genug, dass dies ein Datum ist und daher keine Konvertierung erforderlich ist.
Jacques Mathieu
56

Versuchen Sie, Ihr Datum in eine Zeichenfolge einzufügen.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';
SliverNinja - MSFT
quelle
2
Das Hinzufügen der Zeit ergibt ein genaues Ergebnis: wobei A.Date> = 2014-01-12 12:28:00
shaijut
16

Wir können wie unten auch verwenden

SELECT * 
FROM dbo.March2010 A
WHERE CAST(A.Date AS Date) >= '2017-03-22';

SELECT * 
    FROM dbo.March2010 A
    WHERE CAST(A.Date AS Datetime) >= '2017-03-22 06:49:53.840';
dush88c
quelle
2
Das Ändern der Filterprädikatspalte ist überhaupt keine gute Idee. Es verhindert die Indexnutzung fast vollständig.
Pimbrouwers
3
DateTime start1 = DateTime.Parse(txtDate.Text);

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= start1;

Konvertieren Sie zuerst TexBox in die Datetime und verwenden Sie dann diese Variable in der Abfrage

Suresh Parmar
quelle
3

Zusammenfassend lautet die richtige Antwort:

select * from db where Date >= '20100401'  (Format of date yyyymmdd)

Dadurch werden Probleme mit anderen Sprachsystemen vermieden und der Index verwendet.

Dan
quelle