2

WORK_TIMEデータベーステーブル()の列に、以下EMP_WORKSのようなレコードがあります。

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)

どうすればこれを行うことができますか?

4

3 に答える 3

3

まず、DATE/TIMEフィールドを含むテーブルに主キーが必要です。

私はSQLフィドルでこのデモを設定しました..見てください

私は2つの時間の間の時間の要因としてギャップを表しました。図を操作して、分や日などを表すことができます。

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フィドルのスクリーンショット

于 2012-11-07T08:15:54.153 に答える
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
于 2012-11-07T08:26:51.183 に答える
1

質問で提供された希望の結果に応じて、時間間隔を確認します。また、WORK_TIME列がdateデータ型であり、日付部分があると仮定します(そうでない場合、減算の負の結果(WORK_TIMEfromの前の値)があり00.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
于 2012-11-07T08:40:22.643 に答える