Assuming you need to use a function rather than simply writing a SQL query
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select date '2013-01-01' start_date,
3 date '2013-01-02' end_date,
4 60 interval
5 from dual
6 )
7 select start_date + numtodsinterval( interval * (level-1), 'minute' )
8 from x
9* connect by level <= (end_date - start_date)*24*60/interval
SQL> /
START_DATE+NUMTODSI
-------------------
2013-01-01 00:00:00
2013-01-01 01:00:00
2013-01-01 02:00:00
2013-01-01 03:00:00
2013-01-01 04:00:00
2013-01-01 05:00:00
2013-01-01 06:00:00
2013-01-01 07:00:00
2013-01-01 08:00:00
2013-01-01 09:00:00
2013-01-01 10:00:00
2013-01-01 11:00:00
2013-01-01 12:00:00
2013-01-01 13:00:00
2013-01-01 14:00:00
2013-01-01 15:00:00
2013-01-01 16:00:00
2013-01-01 17:00:00
2013-01-01 18:00:00
2013-01-01 19:00:00
2013-01-01 20:00:00
2013-01-01 21:00:00
2013-01-01 22:00:00
2013-01-01 23:00:00
24 rows selected.
you can create a pipelined table function
SQL> create type tbl_date as table of date;
2 /
Type created.
SQL> create or replace function get_date_interval( p_start_date in date,
2 p_end_date in date,
3 p_interval in number )
4 return tbl_date
5 pipelined
6 is
7 l_return_dt date := p_start_date;
8 begin
9 while( l_return_dt < p_end_date )
10 loop
11 pipe row( l_return_dt );
12 l_return_dt := l_return_dt + numtodsinterval( p_interval, 'minute' );
13 end loop;
14 return;
15 end;
16 /
Function created.
SQL> select *
2 from table( get_date_interval( date '2013-01-01',
3 date '2013-01-02',
4 60 ));
COLUMN_VALUE
-------------------
2013-01-01 00:00:00
2013-01-01 01:00:00
2013-01-01 02:00:00
2013-01-01 03:00:00
2013-01-01 04:00:00
2013-01-01 05:00:00
2013-01-01 06:00:00
2013-01-01 07:00:00
2013-01-01 08:00:00
2013-01-01 09:00:00
2013-01-01 10:00:00
2013-01-01 11:00:00
2013-01-01 12:00:00
2013-01-01 13:00:00
2013-01-01 14:00:00
2013-01-01 15:00:00
2013-01-01 16:00:00
2013-01-01 17:00:00
2013-01-01 18:00:00
2013-01-01 19:00:00
2013-01-01 20:00:00
2013-01-01 21:00:00
2013-01-01 22:00:00
2013-01-01 23:00:00
24 rows selected.