2014-05-13 2 views
1

Мне нужно создать список дней между двумя заданными датами. запрос должен быть чем-то вродеВыберите дни между датой начала и окончания

Select ... from ... where "date" is between date1 and date2 

И ответ на «2014-05-12» и «2014-05-16» должен быть

Monday | 2014-05-12 
Tuesday | 2014-05-13 
Wednesday| 2014-05-14 
Thursday | 2014-05-15 
Friday | 2014-05-16 

начала и дата окончания не будет более 1 месяца друг от друга и всегда будет в будущем. Я бы предпочел не делать таблицу или просмотр со всеми датами, но если это единственное решение ...

Я нашел generate days from date range, но данный запрос дал ошибку, и я не понимаю его вообще, поэтому не могу начните искать то, что может вызвать ошибку.

Спасибо за помощь

+0

Какой был код, который вы пробовали, и какую ошибку вы получили? – Joe

ответ

2
with days as (
    select date '2014-05-12' + (level - 1) as day 
    from dual 
    connect by level <= date '2014-05-16' - date '2014-05-12' + 1 
) 
select * 
from days 
order by day; 

SQLFiddle: http://sqlfiddle.com/#!4/d41d8/29558

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

create or replace type date_list as table of date 
/

create or replace function generate_series(p_start_date date, p_end_date date) 
    return date_list 
    pipelined 
is 
    l_count integer; 
begin 
    l_count := trunc(p_end_date) - trunc(p_start_date); 
    for i in 0..l_count loop 
    pipe row (p_start_date + i); 
    end loop; 
end; 
/ 
+0

Можно ли отформатировать их? – ThomasS

+1

@Thomass: Да, он возвращает значения 'DATE', которые можно форматировать с помощью' to_char() '. Подробнее см. В руководстве: http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions200.htm#i1009324 –

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