Подтвердить что ты не робот

Oracle SQL - DATE больше, чем оператор

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

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

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

Ошибка в командной строке: 10 столбцов: 25

Blockquote

Отчет об ошибке -

Ошибка SQL: ORA-01861: литерал не соответствует строке формата 01861. 00000 - "literal не соответствует строке формата"

* Причина. Литералы на входе должны быть той же длины, что и литералы в            строка формата (за исключением ведущих пробелов). Если            Модификатор "FX" включен, буквально должна соответствовать точно,            без лишних пробелов.

* Действие: исправьте строку формата в соответствии с литералом.

4b9b3361

Ответ 1

Поскольку ваша строка запроса является литералом, и если ваши даты будут правильно сохранены как DATE, вы должны использовать литералы даты:

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

Ответ 2

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