2015-11-09 50 views
1

我需要一个oracle查询,它在给定两个时间戳之间每分钟返回一次。我提到了this堆栈溢出问题。 我们可以改进相同的查询吗?Oracle查询在两个时间戳之间每分钟获取一次

+1

我希望有一个永久[数字表(http://web.archive.org/web/你的价值观20150411042510/HTTP://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html)。本文基于SQL Server,但概念在任何DBMS中都是相同的。 –

+0

@VladimirBaranov不,你不需要这样的需求的静态表。你只需要有开始和结束的日期时间,其余的是一个简单的分层查询生成所需的行,通常称为[**行生成器**](http://lalitkumarb.com/2015/04/15/生成最新的月名周数天数间两日,在Oracle的SQL /)。 –

+0

@LalitKumarB,我不是说你需要**一张永久性的桌子。正如您所示,您可以即时生成它,或者您可以将它放在磁盘上。我更喜欢把它放在磁盘上。它在很多情况下都很有用。 –

回答

1

要使用Row Generator技术得到所有两个日期时间元素之间的分钟数,你需要在日期之间的差值转换成分钟数。在CONNECT BY子句中,其余部分保持不变。

例如,让所有的分11/09/2015 11:00:0011/09/2015 11:15:00之间:

SQL> WITH DATA AS 
    2 (SELECT to_date('11/09/2015 11:00:00', 'DD/MM/YYYY HH24:MI:SS') date_start, 
    3  to_date('11/09/2015 11:15:00', 'DD/MM/YYYY HH24:MI:SS') date_end 
    4 FROM dual 
    5 ) 
    6 SELECT TO_CHAR(date_start+(LEVEL -1)/(24*60), 'DD/MM/YYYY HH24:MI:SS') the_date 
    7 FROM DATA 
    8 CONNECT BY level <= (date_end - date_start)*(24*60) +1 
    9/

THE_DATE 
------------------- 
11/09/2015 11:00:00 
11/09/2015 11:01:00 
11/09/2015 11:02:00 
11/09/2015 11:03:00 
11/09/2015 11:04:00 
11/09/2015 11:05:00 
11/09/2015 11:06:00 
11/09/2015 11:07:00 
11/09/2015 11:08:00 
11/09/2015 11:09:00 
11/09/2015 11:10:00 
11/09/2015 11:11:00 
11/09/2015 11:12:00 
11/09/2015 11:13:00 
11/09/2015 11:14:00 
11/09/2015 11:15:00 

16 rows selected. 

以上,CONNECT BY level <= (date_end - date_start)*(24*60) +1意味着我们正在生成行多达数(date_end - date_start)*(24*60) +1。您获得16行,因为它包括开始分钟的结束窗口。

+0

感谢您的回答。其他答案也是正确的,但我更喜欢这一个。 – thanuja

+0

@thanuja不客气! –

1

如果你希望所有分钟SYSDATE至11月15日,您可以创建这样的:

SELECT to_char(TRUNC(sysdate) + numtodsinterval(level - 1, 'minute'), 
       'dd.mm.yyyy hh24:mi') min 
    FROM dual 
CONNECT BY LEVEL <= 
      (trunc((TO_DATE('16-NOV-2015','dd-mon-yyyy')) - sysdate) * 24 * 60); 
1

你也可以使用下面,给代替SYSTIMESTAMP和SYSTIMESTAMP + 1

select (systimestamp)+level/(24*60) as Rang_values 
    from 
    dual 
    connect by level 
    <= 
    (
    select extract(minute from diff)+ 
    extract(day from diff)*24*60 + 
    extract(hour from diff)*60 as diff 
    from 
    ( 
    select systimestamp+1-systimestamp diff from dual 
    ) 
    ) 
相关问题