2015-11-09 51 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 
    ) 
    ) 
相關問題