如何使用时间戳查询Date的Oracle列

时间:2016-03-09 15:59:46

标签: sql oracle

我有一张下面结构的表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编码?

感谢

1 个答案:

答案 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));