2015-03-23 2 views
0

Я пытаюсь вернуть информацию о машинах в мой стол «Автомобили», у которых есть MOT в течение следующих 2 недель. MOTDUE была определена как to_date('2015-03-25', 'yyyy-mm-dd');Oracle SQL Восстановить даты в течение 2 недель

SELECT * FROM Cars WHERE MOTDUE = CURRENT_DATE + INTERVAL '2' WEEK; 

просто дает мне «отсутствует или недействителен поле даты и времени» ошибка.

Спасибо.

ответ

1

В зависимости от того, что вы имеете в виду «в течение ближайших двух недель» и предполагая, что тип данных в MOTDUE столбце DATE, то следующий должен дать вам то, что вам нужно (или, по крайней мере, позволит вам изменить соответствующим образом):

select * 
from cars 
where motdue < trunc(sysdate) + 14 
and motdue >= trunc(sysdate); 
+0

Кажется, работать, как я хочу! Благодаря! – Andy

1

Попробуйте это:

SELECT * FROM Cars WHERE MOTDUE = CURRENT_DATE + INTERVAL '14' DAY; 
+0

Я пробовал это, и он больше не дает мне ошибку, но он также просто ничего не возвращает. Хотя я знаю, что есть автомобиль с MOTDUE через 2 дня. Благодарю. – Andy

+0

Причиной этого является то, что вы запрашиваете даты создания, равные единовременной дате 14 дней в будущем. Вы не запрашиваете диапазон. – Boneist

0

Есть два типа INTERVAL с в Oracle - YEAR TO MONTH и DAY TO SECOND. Таким образом, YEAR, MONTH, DAY, HOUR, MINUTE и SECOND являются действительными приращениями. WEEK, к сожалению, нет (и не FORTNIGHT, к сожалению). Стандартный способ ANSI делать это было бы что-то вроде следующего:

SELECT * FROM cars 
WHERE motdue >= CURRENT_DATE 
    AND motdue < CURRENT_DATE + INTERVAL '14' DAY; 

Проблема с выше является то, что в Oracle, то ANSI-стандарт CURRENT_DATE не соответствует стандарту ANSI - это имеет временную часть как SYSDATE. Это нормально, если вы не хотите урезать даты в полночь.