2016-11-30 62 views
0

所以我有這樣的數據生成兩個時間之間的所有分鐘PLSQL

DATA COUNT 29/11/2016 22:11:00 120 29/11/2016 22:12:00 132 29/11/2016 22:13:00 551 29/11/2016 22:14:00 1 29/11/2016 22:33:00 1

的,我需要獲得所有的分鐘的列表,其中如果不能符合我的連接條件的日期,它會顯示0

因此,在短期:

我需要生成PLSQL兩次之間的所有分鐘,所以我可以用我的數據加入這個名單

回答

1

Thi s應該訣竅,並且會考慮跨越日子的時間(例如, 23:50 - 00:10):

WITH boundary_dates AS (SELECT to_date('29/11/2016 23:50:45', 'dd/mm/yyyy hh24:mi:ss') start_date, 
           to_date('30/11/2016 00:10:00', 'dd/mm/yyyy hh24:mi:ss') end_date 
         FROM dual) 
SELECT trunc(start_date, 'mi') + (LEVEL -1)/1440 dt 
FROM boundary_dates 
CONNECT BY LEVEL <= (end_date - trunc(start_date, 'mi'))*1440 + 1; 

DT 
---------------- 
29/11/2016 23:50 
29/11/2016 23:51 
29/11/2016 23:52 
29/11/2016 23:53 
29/11/2016 23:54 
29/11/2016 23:55 
29/11/2016 23:56 
29/11/2016 23:57 
29/11/2016 23:58 
29/11/2016 23:59 
30/11/2016 00:00 
30/11/2016 00:01 
30/11/2016 00:02 
30/11/2016 00:03 
30/11/2016 00:04 
30/11/2016 00:05 
30/11/2016 00:06 
30/11/2016 00:07 
30/11/2016 00:08 
30/11/2016 00:09 
30/11/2016 00:10 

然後,您只需留下您的加入其他表/視圖/查詢到這一點,並使用NVL /合併輸出0「失蹤」的價值觀。

N.B.我的例子使用子查詢來傳入開始/結束日期。你可能會使用變量(可能作爲參數傳入),所以你不需要boundary_dates子查詢。

0

好的。

我花了不到心想:

SELECT 
    (to_date('29-11-2016 20:59:00','DD-MM-YYYY HH24:MI:SS') + level/1440) AS date 
FROM 
    dual 
CONNECT BY LEVEL <= (round((to_date('23:59:59','HH24:MI:SS') - to_date('21:00:00','HH24:MI:SS'))*1440,0)); 

試圖解釋:

(round((to_date('23:59:59','HH24:MI:SS') - to_date('21:00:00','HH24:MI:SS'))*1440,0)我計算分鐘的兩個不同時間之間(所以現在我得到180分鐘)

隨着to_date('29-11-2016 20:59:00','DD-MM-YYYY HH24:MI:SS') + level/1440我總計我的date 29-11-2016 20:59:00所有分鐘前由level/1440

+0

您需要在'connect by level <= ...'子句中包含日期,否則當結束日期與開始日期不同時,會發生什麼? – Boneist

+0

你是什麼意思? –

+0

我會添加一個希望展示的答案,因爲評論太長 – Boneist

相關問題