2017-07-24 6 views
2
SELECT 
    CASE WHEN '04/10/2006' < '07/01/2013' THEN 'TRUE' ELSE 'FALSE' 
END 

Ausgang: TRUESQL Server - Datum Vergleich

SELECT 
    CASE WHEN '10/31/2006' > '07/01/2012' THEN 'TRUE' ELSE 'FALSE' 
END 

Ausgang: TRUE

Das ist so verwirrend. Ich habe diese beiden Abfragen ausgeführt, und ich habe o/p als wahr für beide Abfragen. Die o/p zu 1. Abfrage ist korrekt. Sollte die Ausgabe zur 2. Abfrage nicht falsch sein? Kann mir bitte jemand helfen?

+5

Ihre Vergleichszeichenfolgen, aber keine Daten. Verwenden Sie entweder DATE oder geben Sie die Zeichenfolgen im Format 'YYYY-MM-DD' an. – dnoeth

+1

Ihre Abfrage vergleicht DATEN nicht, es vergleicht STRINGS – sepupic

+0

SQL weiß nicht, dass Sie möchten, dass Ihre Datumszeichenfolgen (d. H. "10/31/2006") als Daten behandelt werden, sodass sie als Strings behandelt werden. Explizit CAST sie zuerst zu DATETIME-Datentyp. – RBarryYoung

Antwort

3

Dies sind Strings ohne explizite oder implizite Konvertierung in einen date Datentyp.

Der einzige wirklich sichere Formate für Datum/Zeit in SQL-Server, zumindest für datetime und smalldatetime sind: YYYYMMDD und YYYY-MM-DDThh:mm:ss[.nnn] - Bad habits to kick : mis-handling date/range queries - Aaron Bertrand

Try this:

select 
    case 
    when convert(date,'20060410') < convert(date,'20130701') then 'true' 
    else 'false' 
    end 

select 
    case 
    when convert(date,'20061031') > convert(date,'20120701') then 'true' 
    else 'false' 
    end 
1

Immer Standarddatum verwenden Formate. Dann wirst du kein Problem haben. Ich ziehe es YYYY-MM-DD, die unter fast allen Umständen zu einem richtigen Zeitpunkt umgesetzt werden (wenn Sie die Bindestriche auslassen, wird die Konvertierung immer funktioniert):

select (case '2006-04-10' < '2013-07-01' then 'TRUE' else 'FALSE' 
      end) as output_1 
     (case '2006-10-31 > '2012-07-01' then 'TRUE' else 'FALSE' 
      end) as output_2 

Wenn Sie das richtige Format, das Vergleiche funktionieren entweder als Strings oder Datumsangaben.

0

Sie vergleichen Zeichenketten nicht mit Daten, so dass Sie sie zuerst auf Daten umwandeln müssen, dann können Sie sie vergleichen. Hier

ist die Lösung des Problems:

CASE SELECT WHEN Besetzung ('10/31/2006' als Datetime)> Besetzung ('07/01/2012' als Datetime) THEN 'TRUE' ELSE 'FALSCH' ENDE

Viel Spaß !!