2016-09-30 5 views
0

Мне нужен запрос, который будет динамически извлекать последние 12 полных месяцев данных о доставке (за исключением текущего месяца). Поэтому с сегодняшнего дня 30 сентября 2016 года мне понадобятся данные с 1 сентября 2015 года по 31 августа 2016 года. Завтра запрос изменится на диапазон дат от 10-1-15 до 9-30-16.Oracle SQL - последние 12 полных месяцев данных

Вот что я в настоящее время:

WHERE (shipdate BETWEEN TRUNC(sysdate, 'Year') AND sysdate) 

Этот запрос извлекает данные с начала календарного года до сегодняшней даты, вместо предыдущих 12 полных месяцев. Я нашел ответы на это с MySQL и MS SQL Server, но не для Oracle. Как это можно сделать в Oracle?

ответ

0
between add_months(trunc(sysdate, 'month'), -12) and trunc(sysdate, 'month') 

Если партия фактически может быть датируемые ровно в полночь и отгрузок с отметкой времени 1 сентября в 00:00:00 не должна быть включена, то «между» должен быть изменен на

shipdate >= add_months(trunc(sysdate, 'month'), - 12) 
           and shipdate < trunc(sysdate, 'month') 
+0

это данные от «01.09.2016 00:00:00», что не желательно – schurik

+0

Это зависит от фактического бизнеса; Я полагаю, что никто не отправляется в полночь, но если это проблема, вы правы. Я только что отредактировал сообщение, чтобы это отразить. – mathguy

+0

Mathguy, это сработало отлично. Спасибо! К счастью, мы никогда ничего не отправляем в полночь, поэтому я просто использовал оригинальный запрос. –

0

Скажем, у вас есть таблица со списком дат, например, последние 1000 дней:

create table tableTest(shipDate) as 
(
    select trunc(sysdate) - level +1 
    from dual 
    connect by level < 1000 
) 

вы можете использовать следующее:

select min(shipdate), max(shipdate) 
from tableTest 
where shipDate between trunc(add_months(sysdate, -12), 'MONTH') and TRUNC(sysdate, 'MONTH') -1 
+0

Это пропустит поставки после 00:00:00 31 августа; если вы действительно хотите использовать «между» и отрегулировать конечную точку, возможно, вычесть 1/86400 (одну секунду) из 'trunc (sysdate, 'month')' – mathguy

Смежные вопросы