Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle pl/sql平均起始日期差_Sql_Oracle_Plsql - Fatal编程技术网

oracle pl/sql平均起始日期差

oracle pl/sql平均起始日期差,sql,oracle,plsql,Sql,Oracle,Plsql,我需要从该查询中获取日期的平均值 select service_id,t.arrival_date - lag(t.arrival_date) over (partition by t.service_id order by t.arrival_date) as arrival_date_diff from table t 结果我得到了这些数据 +000000000 00:37:00.000000 +000000000 00:23:30.000000 +0

我需要从该查询中获取日期的平均值

select service_id,t.arrival_date - 
       lag(t.arrival_date) over 
          (partition by t.service_id order by t.arrival_date) as arrival_date_diff
from table t
结果我得到了这些数据

+000000000 00:37:00.000000
+000000000 00:23:30.000000
+000000000 00:07:04.000000
我试着用

AVG(arrival_date_diff) to_date(round(avg(to_number(to_char(arrival_date_diff, 'J')))),'J')
如何从该日期差值中获取平均值,并将平均日期转换为分钟

样本数据:

04/06/18 08:57:34,000000
04/06/18 09:34:34,000000
04/06/18 09:34:34,000000
预期结果:以分钟为单位的平均值(例如:8.5)


提前感谢

当您减去两个日期数据类型值时,结果是天数。例如(基于Scott的模式):

如果要选择平均差,则必须使用内联视图或CTE作为平均值,并且不能同时使用分析函数,即
AVG(滞后(…)

最后,当您需要分钟数时,将结果(天,对吗?)乘以24(一天中有24小时)和60(一小时中有60分钟):


[编辑:添加时间戳示例]

SQL> create table test (datum timestamp);

Table created.

SQL> select * From test;

DATUM
---------------------------------------------------------------------------
04.06.18 08:57:34,000000
04.06.18 09:34:34,000000
04.06.18 09:34:34,000000

SQL>
SQL> select datum - lag(datum) over (order by datum) diff
  2  from test;

DIFF
---------------------------------------------------------------------------

+000000000 00:37:00.000000
+000000000 00:00:00.000000

SQL> -- cast timestamps to dates first, then subtract them; for the final result,
SQL> -- multiply number of days by 24 hours (in a day) and 60 minutes (in an hour)
SQL> select avg(diff) * 24 * 60 avg_minutes
  2  from (select cast(datum as date) - cast(lag(datum) over (order by datum) as date) diff
  3        from test
  4       );

AVG_MINUTES
-----------
       18,5

SQL>

你能提供一些样本数据和预期结果吗?这真的很有帮助这可能有助于您创建一个自定义聚合来为时间戳执行此操作,请参阅我获取错误
ORA-00932:不一致的数据类型:预期的数字从一天到一秒的间隔时间
看起来OP正在获取一个
间隔时间
。我猜他们的
arrival\u date
字段是一个时间戳,而不是一个日期,在这种情况下,他们必须这样做才能工作。对;感谢您对Joseleg@kfinity的评论和有用的链接。斯科特没有时间戳,所以我用了我的时间戳。
SQL> with inter as
  2    (select deptno,
  3            hiredate - lag(hiredate) over
  4                       (partition by deptno order by hiredate) diff
  5     from emp
  6  )
  7  select deptno,
  8    avg(diff) avg_diff_days,
  9    --
 10    avg(diff) * (24 * 60) minutes
 11  from inter
 12  group by deptno;

    DEPTNO AVG_DIFF_DAYS    MINUTES
---------- ------------- ----------
        10           114     164160
        20         175,5     252720
        30          57,2      82368

SQL>
SQL> create table test (datum timestamp);

Table created.

SQL> select * From test;

DATUM
---------------------------------------------------------------------------
04.06.18 08:57:34,000000
04.06.18 09:34:34,000000
04.06.18 09:34:34,000000

SQL>
SQL> select datum - lag(datum) over (order by datum) diff
  2  from test;

DIFF
---------------------------------------------------------------------------

+000000000 00:37:00.000000
+000000000 00:00:00.000000

SQL> -- cast timestamps to dates first, then subtract them; for the final result,
SQL> -- multiply number of days by 24 hours (in a day) and 60 minutes (in an hour)
SQL> select avg(diff) * 24 * 60 avg_minutes
  2  from (select cast(datum as date) - cast(lag(datum) over (order by datum) as date) diff
  3        from test
  4       );

AVG_MINUTES
-----------
       18,5

SQL>