2015-05-31 19 views
27

Khi tiêu đề cho biết, tôi muốn tìm cách kiểm tra bộ dữ liệu nào trong 6 tháng qua từ SYSDATE qua truy vấn.Oracle SQL - DATE lớn hơn tuyên bố

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

Tôi đã thử cách sau nhưng trả về lỗi nói định dạng ngày của tôi sai. Tuy nhiên, chèn dữ liệu tôi đã sử dụng định dạng ngày đó theo yêu cầu/dự định và không có vấn đề gì.

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

Ngày của bạn có được lưu trữ là 'DATE' hoặc là' VARCHAR' không? –

+0

'DATE' được lưu trữ như vậy và tôi không thể chuyển đổi chúng bằng cách sử dụng to_date – user3521826

Trả lời

30

Như chuỗi truy vấn của bạn là một chữ, và giả sử ngày của bạn được lưu trữ đúng cách như DATE bạn nên sử dụng date literals:

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

Nếu bạn muốn sử dụng TO_DATE (bởi vì, ví dụ, giá trị truy vấn của bạn không phải là một chữ), tôi đề nghị bạn đặt rõ ràng tham số NLS_DATE_LANGUAGE khi bạn đang sử dụng tên tháng viết tắt của Hoa Kỳ. Bằng cách đó, nó sẽ không phá vỡ trên một số địa phương Oracle Cài đặt:

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

HOẶC

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

HOẶC

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

này sẽ chỉ làm việc nếu OrderDate được lưu trữ trong Date format . Nếu đó là Varchar, bạn nên áp dụng to_date() func trên cột đó cũng như

SELECT * FROM OrderArchive 
    WHERE to_date(OrderDate,'yyyy-Mm-dd') <= to_date('2014-12-31','yyyy-MM-dd'); 
Các vấn đề liên quan