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 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 小提琴截图

于 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_TIME来自的前一个值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 回答