2015-05-31 4 views
27

Как говорится в названии, я хочу найти способ проверить, какие из моих наборов данных находятся за 6 месяцев после SYSDATE через запрос.Oracle SQL - DATE больше, чем оператор

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

Я пробовал следующее, но он возвращает ошибку, говоря, что мой формат даты неверен. Однако, вставив данные, я использовал этот формат даты в соответствии с запрошенным/предполагаемым и не имел проблем.

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

ли ваша дата хранится в виде 'date' или' VARCHAR'? –

+0

«DATE» хранится как таковое, и я не могу их преобразовать, используя to_date – user3521826

ответ

30

В вашей строке запроса является буквальным, и предполагая, что ваши даты должным образом сохранены как DATE вы должны использовать date literals:

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

Если вы хотите использовать TO_DATE (потому что, например, ваше значение запроса не является буквальным), я предлагаю вам явно установить параметр NLS_DATE_LANGUAGE, поскольку вы используете имена сокращенных месяцев США. Таким образом, он не сломается на некоторые локализованную Oracle Установка:

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

ИЛИ

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

ИЛИ

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

Это будет работать только если OrderDate хранится в Date format , Если Varchar следует применять to_date() FUNC на этой колонке также как

SELECT * FROM OrderArchive 
    WHERE to_date(OrderDate,'yyyy-Mm-dd') <= to_date('2014-12-31','yyyy-MM-dd'); 
Смежные вопросы