我有一张下面结构的表1:
workflow_name varchar2(50)
session_name varchar2(50)
actual_start Date
TableData如下所示:
workflow1 session1 21-JAN-16 21:30:49
现在我想在30分钟时运行查询。如果我在上午10点跑步,则意味着我想知道从早上9点30分到早上9点59分运行的会话次数
我会写我的查询
select count(*) from table1
where workflowname ='workflow1'
and sessionname ='sessionname1'
and actual_start should between 9.30am to 9.59am
我如何在上午9点30分到9点9分之间为actual_start编码?
感谢
答案 0 :(得分:1)
编辑:修正了端点计算中的错误!
在任何特定时刻,这将给出最近通过的半小时间隔:
select case when sysdate - trunc(sysdate,'HH') > (30/1440) then trunc(sysdate,'HH')
else trunc(sysdate,'HH')- (30/1440) end as start_point
,case when sysdate - trunc(sysdate,'HH') > (30/1440) then trunc(sysdate,'HH') + (30/1440)
else trunc(sysdate,'HH') end as end_point
from dual
所以在10:01它将在今天的9:30 - 10:00给出,在10:40它将在今天的10:00 - 10:30给出。
所以你只需要寻找那个范围内的数据(你需要弄清楚终点在哪里下降,因为一端需要包容,而另一个是排他性的,以避免一行被计算两次。我做了较低的绑定在我的例子中):
SELECT *
FROM table1
WHERE actual_start_date >= (select case when sysdate - trunc(sysdate,'HH') > (30/1440) then trunc(sysdate,'HH')
else trunc(sysdate,'HH')- (30/1440) end
FROM DUAL)
AND actual_start_date < (SELECT case when sysdate - trunc(sysdate,'HH') > (30/1440) then trunc(sysdate,'HH') + (30/1440)
else trunc(sysdate,'HH') end
from dual)
现在,无论何时运行,您都将获得最近进行的半小时。
如果你想要真正的简单查询 - 只需从现在开始获取最近30分钟的行,那么只需:
SELECT *
FROM table1
WHERE actual_start_date >= (sysdate - (30/1440));