Временные метки и интервалы: NUMTOYMINTERVAL ВЫЧИСЛЕНИЕ СИСТЕМНОЙ ДАТЫ SQL-ЗАПРОС

Я работаю над проблемой домашнего задания, я близок, но мне нужна помощь с преобразованием данных. Или sysdate - расчет start_date

Вопрос в том:

Используя схему EX, напишите оператор SELECT, который извлекает date_id и start_date из таблицы Date_Sample (формат ниже), за которым следует столбец с именем Years_and_Months_Since_Start, который использует интервальную функцию для получения количества лет и месяцев, прошедших между start_date и системная дата. (Ваши значения будут различаться в зависимости от даты выполнения этой лабораторной работы.) Отображать только записи с датами начала, у которых месяц и день равны 28 февраля (любого года).

DATE_ID     START_DATE                          YEARS_AND_MONTHS_SINCE_START 
2           Sunday   , February  28, 1999       13-8                         
4           Monday  , February  28, 2005        7-8                          
5           Tuesday  , February  28, 2006       6-8 

Наша схема EX, которая относится к этому вопросу, представляет собой просто таблицу Date_Sample с двумя столбцами:

DATE_ID     NUMBER NOT Null

START_DATE  DATE

Я написал этот код:

SELECT date_id, TO_CHAR(start_date, 'Day, MONTH DD, YYYY') AS start_date , 
  NUMTOYMINTERVAL((SYSDATE - start_date), 'YEAR') AS years_and_months_since_start
FROM  date_sample
WHERE TO_CHAR(start_date, 'MM/DD') = '02/28';

Но моя колонка «Годы и месяцы с момента запуска» не работает должным образом. Получаются очень высокие цифры по годам и месяцам, когда вычисленная дата относится к 1999 году. т.е. должно быть 13-8, а я получаю 5027-2, так что я знаю, что это неправильно. Я использовал NUMTOYMINTERVAL, что должно быть правильно, но не думаю, что sysdate-start_date работает. Тип данных для start_date — просто дата. Я попробовал ROUND, но, возможно, мне нужна помощь, чтобы понять это правильно.

Что-то не так с моим расчетом и попытками выяснить, как получить там правильный интервал. Не уверен, что я предоставил достаточно информации всем, но я дам вам знать, если выясню это раньше, чем вы.

Это вопрос из книги Мураха по Oracle и SQL/PL, глава 17, если кто-то еще пытается изучить эту главу. Страница 559.


person MeachamRob    schedule 03.12.2012    source источник


Ответы (2)


вам понадобится MONTHS_BETWEEN в этом numtoyminterval, так как результат вычитания двух переменных даты дает ответ в днях, который вам не подходит, и причина, по которой он такой высокий, заключается в том, что вы сказали Oracle, что ответ был в годах! Также используйте модификатор fm для to_char, чтобы избежать лишних пробелов.

select date_id, 
       to_char(start_date, 'fmDay, Month DD, YYYY') as start_date,
       extract(year from numtoyminterval(months_between(trunc(sysdate), start_date), 'month') )
       || '-' ||
       extract(month from numtoyminterval(months_between(trunc(sysdate), start_date), 'month') )
       as years_and_months_since_start
  from your_table
 where to_char(start_date, 'MM/DD') = '02/28';
person DazzaL    schedule 03.12.2012
comment
Спасибо Months_between это путь туда. Любые возможности написания запроса без выписки и года выпуска. Мы еще не проходили это в классе. Это действительно дает мне правильный ответ, который все же имеет значение. Еще раз спасибо за ваше время сегодня! - person MeachamRob; 03.12.2012
comment
нет, так как тип данных interval на самом деле не форматируется (хорошее упущение от Oracle), т.е. to_char() не может быть выполнено с каким-либо эффектом на них. поэтому, если вы просто выберете его, вы увидите его в стандартном формате или +годы-месяцы, например +000000001-10. единственный способ отформатировать это с помощью extract() и ручного построения строк. - person DazzaL; 03.12.2012

Вы можете упростить ответ, как это

SELECT date_id,  start_date, numtoyminterval(months_between(sysdate, start_date), 'month') as "Years and Months Since Start"
FROM date_sample
WHERE EXTRACT (MONTH FROM start_date) = 2 AND EXTRACT (DAY FROM start_date) = 28;
person Tim Stone    schedule 04.05.2013