2012-11-07 65 views
2

在我的數據庫表(EMP_WORKS)的WORK_TIME列中,我有如下記錄。在時間範圍之間獲得差距

WORK_TIME 

19:03:00 
20:00:00 
21:02:00 
21:54:00 
23:04:00 
00:02:00 

我想創建一個數據庫view使用這些數據。因爲我需要在以下時間之間得到Gap

WORK_TIME GAP 

19:03:00 - 
20:00:00 00:57:00 (Gap between 19:03:00 and 20:00:00) 
21:02:00 01:02:00 (Gap between 20:00:00 and 21:02:00) 
21:54:00 00:52:00 (Gap between 21:02:00 and 21:54:00) 
23:04:00 01:10:00 (Gap between 21:54:00 and 23:04:00) 
00:02:00 00:58:00 (Gap between 23:04:00 and 00:02:00) 

我怎麼能這樣做?

+1

:使用'LAG'分析功能來實現這一 –

回答

1

根據你想要的結果,在這個問題提供的,你想看到的時間間隔。我也想WORK_TIME列是date數據類型,並有一個日期部分(否則會有一個負的減法結果(以前的值WORK_TIME00.02.00))。

SQL> create table Work_times(
    2 work_time 
    3 ) as 
    4 (
    5 select to_date('01.01.2012 19:03:00', 'dd.mm.yyyy hh24:mi:ss') from dual union all 
    6 select to_date('01.01.2012 20:00:00', 'dd.mm.yyyy hh24:mi:ss') from dual union all 
    7 select to_date('01.01.2012 21:02:00', 'dd.mm.yyyy hh24:mi:ss') from dual union all 
    8 select to_date('01.01.2012 21:54:00', 'dd.mm.yyyy hh24:mi:ss') from dual union all 
    9 select to_date('01.01.2012 23:04:00', 'dd.mm.yyyy hh24:mi:ss') from dual union all 
10 select to_date('02.01.2012 00:02:00', 'dd.mm.yyyy hh24:mi:ss') from dual 
11 ) 
12/

Table created 

SQL> 
SQL> select to_char(t.work_time, 'hh24.mi.ss') work_time 
    2   , (t.work_time - 
    3   lag(t.work_time) over(order by WORK_TIME)) day(1) to second(0) Res 
    4 from work_times t 
    5 ; 

WORK_TIME RES 
--------- ------------------------------------------------------------------------------- 
19.03.00 
20.00.00 +0 00:57:00 
21.02.00 +0 01:02:00 
21.54.00 +0 00:52:00 
23.04.00 +0 01:10:00 
00.02.00 +0 00:58:00 

6 rows selected 
3

首先,您需要在包含DATE/TIME字段的表中使用主鍵。

我已經建立了這個demo on SQL Fiddle ..看一看

我曾經代表了差距的兩倍小時之間的一個因素。你可以操縱這個數字來表示分鐘,或者幾天,不管。

SELECT 
TO_CHAR(A.WORK_TIME,'HH24:MI:SS') WORK_FROM, 
TO_CHAR(B.WORK_TIME,'HH24:MI:SS') WORK_TO, 
ROUND(24*(B.WORK_TIME-A.WORK_TIME),2) GAP FROM 
    sample A, 
    SAMPLE B 
WHERE A.ID+1 = B.ID(+) 

如果你的主鍵值有(主鍵的值中的空白)差大於1,那麼你將需要動態偏移值是這樣的:

SELECT 
TO_CHAR(A.WORK_TIME,'HH24:MI:SS') WORK_FROM, 
TO_CHAR(B.WORK_TIME,'HH24:MI:SS') WORK_TO, 
ROUND(24*(B.WORK_TIME-A.WORK_TIME),2) GAP FROM 
    sample A, 
    SAMPLE B 
WHERE b.ID = (select min(C.ID) from sample c where c.id>A.ID) 

SQL Fiddle Screenshot

+0

此,如果你有你'ID's缺口將無法正常工作,螞蟻我建議不使用舊的連接語法'(+)'任何更多。 –

+0

@PeterLang我編輯了我的答案,以解決主鍵值 – Ahmad

+0

中的空白不確定您是否測試了更新後的查詢,但SQL-Fiddle說'ORA-01799:列可能不是外連接到子查詢' –

3

這個查詢會得到你在小時內的差異:

SELECT 
    work_time, 
    (work_time - LAG(work_time) OVER (ORDER BY work_time)) * 24 AS gap 
FROM emp_works 

SQL Fiddle回報這個例子:

WORK_TIME       GAP 
November, 07 2012 19:03:00+0000  (null) 
November, 07 2012 20:00:00+0000  0.95 
November, 07 2012 21:02:00+0000  1.033333333333 
November, 07 2012 21:54:00+0000  0.866666666667 
November, 07 2012 23:04:00+0000  1.166666666667 
November, 08 2012 00:02:00+0000  0.966666666667 
相關問題