查询以生成日期时间列表
Query to generate a list of date times
我想构建一个查询,其中包含一些名为:
的变量
EndDate --this is a date
LookBackDays --this is an integer
Interval -- this is an interval in SECONDS
Name -- this is a string
open -this is a string and is hours and minutes in 24HH
close - this is string and is hours and minutes in 24HH
假设我将变量设置为:
EndDate to 7/4
LookBackDays = 3
Inteval = 300 seconds
Name = "BOB"
open = "09:00"
close = "13:00"
然后我想生成一个从 Endate-LookbackDays 到 EndDate 的日期列表,看起来像
看起来像
Date Open Close Name
7/1/2015 09:00 AM 13:00 PM Bob
7/2/2015 09:00 AM 13:00 PM Bob
7/3/2015 09:00 AM 13:00 PM Bob
7/4/2015 09:00 AM 13:00 PM Bob
....
....
然后对于每个日期,我想使用 Interval 参数添加额外的行,其中对于每一行,我根据间隔将从打开时间到关闭时间的时间间隔分解到桶中,因此间隔为300 秒结果将是:
date oepn close name IntervalEnd
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:05 AM
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:10 AM
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:15 AM
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:20 AM
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:25 AM
....
....
7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 7/1/2015 12:55 PM
7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 7/1/2015 01:00 PM
**7/2/2015** 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:05 AM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:10 AM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:15 AM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:20 AM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:25 AM
....
....
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 12:55 PM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 01:00 PM
...每天以此类推。所以基本上我每天都把它扩展到多个桶中
您可以交叉连接两个分层查询,如下所示:
with par as (
select date '2015-07-04' enddate, 3 LookBackDays, 300 inteval, 'Bob' Name,
'09:00' open, '13:00' close from dual),
t1 as (
select to_char(enddate-level+1, 'yyyy-mm-dd') dt, name, open, close from par
connect by level <= LookBackDays + 1 ),
t2 as (
select to_char(to_date(open, 'hh24:mi') + (level) * inteval / (24*60*60), 'hh24:mi') tm
from par
connect by to_date(open, 'hh24:mi') + level * inteval / (24*60*60)
<= to_date(close, 'hh24:mi') )
select to_date(dt, 'yyyy-mm-dd') dt,
to_date(dt||' '||open, 'yyyy-mm-dd hh24:mi') open,
to_date(dt||' '||close, 'yyyy-mm-dd hh24:mi') close, name,
to_date(dt||' '||tm, 'yyyy-mm-dd hh24:mi') IntervalEnd
from t1 cross join t2 order by dt, tm
我想构建一个查询,其中包含一些名为:
的变量 EndDate --this is a date
LookBackDays --this is an integer
Interval -- this is an interval in SECONDS
Name -- this is a string
open -this is a string and is hours and minutes in 24HH
close - this is string and is hours and minutes in 24HH
假设我将变量设置为:
EndDate to 7/4
LookBackDays = 3
Inteval = 300 seconds
Name = "BOB"
open = "09:00"
close = "13:00"
然后我想生成一个从 Endate-LookbackDays 到 EndDate 的日期列表,看起来像
看起来像
Date Open Close Name
7/1/2015 09:00 AM 13:00 PM Bob
7/2/2015 09:00 AM 13:00 PM Bob
7/3/2015 09:00 AM 13:00 PM Bob
7/4/2015 09:00 AM 13:00 PM Bob
....
....
然后对于每个日期,我想使用 Interval 参数添加额外的行,其中对于每一行,我根据间隔将从打开时间到关闭时间的时间间隔分解到桶中,因此间隔为300 秒结果将是:
date oepn close name IntervalEnd
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:05 AM
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:10 AM
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:15 AM
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:20 AM
7/1/2015 7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 09:25 AM
....
....
7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 7/1/2015 12:55 PM
7/1/2015 09:00 AM 7/1/2015 13:00 PM Bob 7/1/2015 01:00 PM
**7/2/2015** 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:05 AM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:10 AM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:15 AM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:20 AM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 09:25 AM
....
....
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 12:55 PM
7/2/2015 7/2/2015 09:00 AM 7/2/2015 13:00 PM Bob 01:00 PM
...每天以此类推。所以基本上我每天都把它扩展到多个桶中
您可以交叉连接两个分层查询,如下所示:
with par as (
select date '2015-07-04' enddate, 3 LookBackDays, 300 inteval, 'Bob' Name,
'09:00' open, '13:00' close from dual),
t1 as (
select to_char(enddate-level+1, 'yyyy-mm-dd') dt, name, open, close from par
connect by level <= LookBackDays + 1 ),
t2 as (
select to_char(to_date(open, 'hh24:mi') + (level) * inteval / (24*60*60), 'hh24:mi') tm
from par
connect by to_date(open, 'hh24:mi') + level * inteval / (24*60*60)
<= to_date(close, 'hh24:mi') )
select to_date(dt, 'yyyy-mm-dd') dt,
to_date(dt||' '||open, 'yyyy-mm-dd hh24:mi') open,
to_date(dt||' '||close, 'yyyy-mm-dd hh24:mi') close, name,
to_date(dt||' '||tm, 'yyyy-mm-dd hh24:mi') IntervalEnd
from t1 cross join t2 order by dt, tm