Как выбрать результаты между двумя датами или по одному году / месяцу / дню в оракуле? (to_date, extract, sysdate) - PullRequest
3 голосов
/ 25 января 2010

У меня есть таблица для заказов, и она имеет 2 столбца с типами DATE: delivery_date и order_date. В моем sqldeveloper все даты, которые я вставил через Java или вручную, имеют формат 10.01.25 для 25 января этого года. Когда я пытаюсь увидеть total_price для заказов между одной датой и другой, я вынуждаю формат следующим образом:

create or replace function calc_Outlays (init_date IN DATE,final_date IN date)return number is

v_total_enc FORNECIMENTO.TOTAL_ENC_FORNEC%TYPE;

begin
select f.total_enc_fornec into v_total_enc from fornecimento f where f.data_entrega between init_date and final_date;
return v_total_enc;

Exception 
When no_data_found then
Insert Into errors Values (0,'No supplyment costs found for dates between '||to_char(init_date)||' and '||to_char(final_date),systimestamp);
return -1;
end;

но я вернул -1 Я даже пытаюсь сделать запрос так: select f.total_enc_fornec from fornecimento f where f.data_entrega = '10.01.24';
как это: select f.total_enc_fornec from fornecimento f where f.data_entrega = to_date('10.01.24','yy-mm-dd');
как это: select f.total_enc_fornec from fornecimento f where f.data_entrega < to_date('10.01.24'); и НИЧЕГО не возвращается! но если я выполню: select f.total_enc_fornec from fornecimento f where f.data_entrega <= sysdate;, он печатает результат, как и положено ...

Как я могу это сделать? Я явно неправильно передаю ни параметры, ни функцию, ни сам запрос

Кстати, а если бы я хотел выбрать ВСЕ заказы какого-нибудь года / месяца / дня? Скажем, используя функцию извлечения, например. Не могли бы вы показать мне, как? Я пытался, но у меня те же проблемы, и я по-простому в концепции, по крайней мере, LOL.

1 Ответ

3 голосов
/ 25 января 2010

Тип Oracle DATE сохраняет дату + время до ближайшей секунды - поэтому, если вы скажете f.data_entrega = '10.01.24', он не будет соответствовать записи, где f.data_entrega равно 10.01.24 в 6:00. SYSDATE, аналогично, возвращает текущее время и сегодняшнюю дату.

Если вы хотите, чтобы ваша функция соответствовала только в части даты (т.е. игнорировать любые значения времени), вам может потребоваться изменить функцию:

select f.total_enc_fornec into v_total_enc
from fornecimento f
where f.data_entrega between TRUNC(init_date) and TRUNC(final_date) + 0.99999;
...