2015-05-31 14 views
27

Wie der Titel sagt, möchte ich einen Weg finden zu überprüfen, welche meiner Datensätze über 6 Monate von SYSDATE über Abfrage sind.Oracle SQL - DATE größer als Anweisung

Ich habe Folgendes versucht, aber es gibt einen Fehler zurück, der besagt, dass mein Datumsformat falsch ist. Das Einfügen der Daten nutzte ich jedoch wie gewünscht/beabsichtigt und hatte keine Probleme.

Error at Command Line : 10 Column : 25

Blockquote

Error report -

SQL Error: ORA-01861: literal does not match format string 01861. 00000 - "literal does not match format string"

*Cause: Literals in the input must be the same length as literals in the format string (with the exception of leading whitespace). If the "FX" modifier has been toggled on, the literal must match exactly, with no extra whitespace.

*Action: Correct the format string to match the literal.

+1

Sind Sie das Datum gespeichert, wie 'DATE' oder als' VARCHAR'? –

+0

'DATE' gespeichert als das, und ich kann sie nicht mit to_date konvertieren – user3521826

Antwort

30

Als Ihre Abfrage-String ist eine wörtliche, und vorausgesetzt, Ihre Daten werden korrekt gespeichert, wie DATE sollten Sie date literals verwenden:

SELECT * FROM OrderArchive 
WHERE OrderDate <= DATE '2015-12-31' 

Wenn Sie TO_DATE verwenden möchten (weil zum Beispiel Ihre Abfragewert ist kein Literal), ich schlage vor, dass Sie den Parameter NLS_DATE_LANGUAGE explizit angeben, da Sie abgekürzte Monatsnamen aus den USA verwenden. Auf diese Weise wird es nicht einige lokalisierte Oracle-Installation brechen auf:

SELECT * FROM OrderArchive 
WHERE OrderDate <= to_date('31 Dec 2014', 'DD MON YYYY', 
          'NLS_DATE_LANGUAGE = American'); 
17
you need to convert the string to date using to_date() function 

SELECT * FROM OrderArchive 
WHERE OrderDate <= to_date('31-Dec-2014','DD-MON-YYYY'); 

ODER

SELECT * FROM OrderArchive 
WHERE OrderDate <= to_date('31 Dec 2014','DD MON YYYY'); 

ODER

SELECT * FROM OrderArchive 
WHERE OrderDate <= to_date('2014-12-31','yyyy-MM-dd'); 

Dies funktioniert nur, wenn OrderDate in Date format gespeichert . Wenn es Varchar sollten Sie to_date() func auf dieser Spalte gelten auch wie

SELECT * FROM OrderArchive 
    WHERE to_date(OrderDate,'yyyy-Mm-dd') <= to_date('2014-12-31','yyyy-MM-dd'); 
Verwandte Themen