2015-05-31 23 views
27

Jak mówi tytuł, chcę znaleźć sposób sprawdzenia, który z moich zestawów danych minął 6 miesięcy od SYSDATE za pomocą zapytania.Oracle SQL - DATA większa niż instrukcja

SELECT * FROM OrderArchive 
WHERE OrderDate <= '31 Dec 2014'; 

Próbowałem następujące rzeczy, ale zwraca błąd, mówiąc, że mój format daty jest nieprawidłowy. Jednak wstawienie danych użyłem tego formatu daty zgodnie z żądaniem/zamierzonym i nie było problemów.

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

Czy data przechowywana jako '' dzień spełnienia wymogu lub VARCHAR'? –

+0

"DATA" jest zapisane jako takie i nie mogę ich przekonwertować za pomocą to_date – user3521826

Odpowiedz

30

Jako twój ciąg kwerendy jest dosłowne, i zakładając, że terminy są prawidłowo przechowywane jako DATE należy użyć date literals:

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

Jeśli chcesz użyć TO_DATE (ponieważ, na przykład, wartość zapytań nie jest literałem), proponuję jawnie ustawić parametr NLS_DATE_LANGUAGE, tak jak używasz skróconych nazw miesięcy w USA. W ten sposób, nie złamie się na jakiś zlokalizowaną Oracle Instalacja:

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'); 

LUB

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

LUB

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

ta będzie działać tylko wtedy, gdy jest przechowywany w OrderDateDate format . Jeśli jest Varchar należy zastosować to_date() func na tej kolumny również jak

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