Как указать дату более 3 лет назад?

Отображение сведений о книге, изданной более 3 лет назад и проданной менее 10 000 экземпляров.

Мой учитель просит изменить это

Select title_id , title , pubdate , current_date-pubdate, ytd_sales
from titles;

это то, что я сделал

Select title_id , title , pubdate , current_date-pubdate, ytd_sales
from titles
where ytd_sales > 10 000;

но вот проблема, я не могу использовать DATEADD, и я понимаю, что мой учитель поставил current_date - pubdate, я думаю, что он хочет использовать другие методы, но я понятия не имел.

Если использовать DATEADD, он выйдет

ORA-00904: "DATEADD": неверный идентификатор


person Wai Yong Tsang    schedule 21.06.2015    source источник
comment
И теперь, когда вы видите, как форматируется вопрос, пожалуйста, делайте это и в будущем сами. Спасибо.   -  person juergen d    schedule 21.06.2015
comment
Подсказка: add_months().   -  person Gordon Linoff    schedule 21.06.2015
comment
но как я буду использовать curent_date-pubdate внутри него? я до сих пор не ясно об этом   -  person Wai Yong Tsang    schedule 21.06.2015
comment
а мне нужен год? или это должно быть add_years()?   -  person Wai Yong Tsang    schedule 21.06.2015
comment
возможный дубликат эквивалентной функции для DATEADD() в Oracle   -  person Bob Jarvis - Reinstate Monica    schedule 21.06.2015
comment
Хммм... если PUBDATE - это DATE, что возвращает CURRENT_DATE - PUBDATE?   -  person Bob Jarvis - Reinstate Monica    schedule 21.06.2015
comment
да, pubdate — это дата. PublisherDate , я понятия не имел   -  person Wai Yong Tsang    schedule 21.06.2015
comment
@BobJarvis Они имели в виду sysdate .select CURRENT_DATE,SYSDATE из DUAL; CURRENT_DATE SYSDATE ---------------- 21.06.2015 14:02:06 21.06.2015 14:02:06   -  person mahi_0707    schedule 21.06.2015
comment
@MahendarMahi - цель моего сообщения состояла в том, чтобы попытаться заставить OP задуматься. Независимо от того, используется ли SYSDATE или CURRENT_DATE, я пытаюсь выяснить, какое значение возвращает SOME_DATE - SOME_OTHER_DATE и что оно представляет? Спасибо.   -  person Bob Jarvis - Reinstate Monica    schedule 21.06.2015
comment
@BobJarvis понял вашу точку зрения :)   -  person mahi_0707    schedule 22.06.2015


Ответы (2)


Можете ли вы ниже:

alter SESSION set NLS_DATE_FORMAT = 'MM-DD-YYYY HH24:MI:SS' ;

--select * from nls_session_parameters where parameter = 'NLS_DATE_FORMAT';

create table TITLES( title_id number(10), title  varchar2(20), pubdate date, ytd_sales number(10));

insert into TITLES values(101,'ABC',TO_DATE('07-13-2011','MM-DD-YYYY'),20000);    
insert into TITLES values(102,'DEF',TO_DATE('07-13-2014','MM-DD-YYYY'),90000);    
commit;

Select title_id , title , pubdate , round( (trunc(sysdate)-pubdate) /365)  years, ytd_sales
from TITLES
where ytd_sales > 10000
and  round( (trunc(sysdate)-pubdate) /365) > 3 --this will check for the pub date > 3 years
;

ВЫХОД:

введите здесь описание изображения

person mahi_0707    schedule 21.06.2015
comment
omg, это работает, но у меня есть несколько вопросов, чтобы задать, для чего нужен раунд? Транк? - person Wai Yong Tsang; 21.06.2015
comment
TRUNC даст вам только дату (удалив отметку времени), а round даст точный год (округляя дни). Просто попробуйте это -- выберите sysdate,trunc(sysdate) из двойного; - person mahi_0707; 21.06.2015
comment
почему нам нужно удалить отметку времени? Я предполагаю, что, используя round , мы могли бы взять дни, чтобы нам было легче найти годы? Кстати, зачем нам /365? , Извините, у меня плохо с логическим мышлением :( - person Wai Yong Tsang; 21.06.2015
comment
Вычитание двух дат дает вам дни. Чтобы преобразовать в годы, мы делим на 365 (1 год = 365 дней). Да, вы можете заменить на current_date вместо sysdate (у этого есть метка времени), затем на round ((current_date-pubdate) /365) › 3 - person mahi_0707; 21.06.2015
comment
OMG Я получил это, хотя никогда об этом. Последний вопрос, я не понимаю, что вы имеете в виду, TRUNC даст вам свидание в одиночку. Наконец, очень ценю вашу помощь, вы потрясающие! :) - person Wai Yong Tsang; 21.06.2015
comment
Функция TRUNC (дата) возвращает дату с временной частью дня, усеченной до единицы, заданной моделью формата fmt. Возвращаемое значение всегда имеет тип данных DATE, даже если вы укажете другой тип данных datetime для даты. - person mahi_0707; 21.06.2015

Думаю, примерно так.

Select title_id , title , pubdate , current_date-pubdate, ytd_sales
from titles
where ytd_sales > 10 000;
AND pubdate < add_months(sysdate, -36)
person DiscipleMichael    schedule 21.06.2015
comment
Просто убедитесь, что вы полностью понимаете функцию и то, как она используется, прежде чем использовать ее в любом задании. Совсем не помогает закончить задание, но не понять, как оно работает. - person DiscipleMichael; 21.06.2015
comment
SQL> Выберите title_id, title, pubdate, current_date-pubdate, ytd_sales 2 из заголовков 3, где ytd_sales > 10000 4 AND current_date-pubdate ‹ add_months(sysdate, -36); И current_date-pubdate ‹ add_months(sysdate, -36) * ОШИБКА в строке 4: ORA-00932: несовместимые типы данных: ожидаемое ЧИСЛО получило ДАТУ - person Wai Yong Tsang; 21.06.2015
comment
Я отредактировал оператор AND, но я не уверен... Я еще не очень хорошо разбираюсь в Oracle. - person DiscipleMichael; 21.06.2015
comment
Является ли тип данных Pubdate датой или целым числом? - person DiscipleMichael; 21.06.2015
comment
на самом деле это свидание - person Wai Yong Tsang; 21.06.2015
comment
Возможно, вы имели в виду ytd_sales < 10000. - person Bob Jarvis - Reinstate Monica; 21.06.2015