Oracle 中不同行中相同字段的日期/时间差异

Ali*_*ssa 5 sql oracle datetime date-arithmetic

我有以下视图,我需要做的是获取具有相同 Vehicle AND OrderCode 的每 2 条记录之间的字段 ActionDate 的日期差异,我如何在 Oracle 数据库中实现这一点。

还考虑到减去的日期应该是具有模式 O - 模式 I 的日期

我需要获取差异列表才能获得该时间的平均值。

谢谢你的帮助。

数据

Lal*_*r B 4

您可以使用分析LAG() OVER()函数来获取日期之间的差异。

例如,

SQL> WITH t AS
  2  (
  3    select 'O' as "MODE", 'V1234567890' as  Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 16:34:35','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
  4    union all
  5    select 'I' as "MODE", 'V1234567890' as  Vehicle, '1411196232' as OrderCode, to_date('2014-11-19 15:27:09','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
  6    union all
  7    select 'O' as "MODE", 'V2987654321' as  Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 14:03:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
  8    union all
  9    select 'I' as "MODE", 'V2987654321' as  Vehicle, '1411206614' as OrderCode, to_date('2014-11-20 13:47:02','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
 10    union all
 11    select 'O' as "MODE", 'V2987654321' as  Vehicle, '1411185798' as OrderCode, to_date('2014-11-20 01:40:58','yyyy-mm-dd hh24:mi:ss') as ActionDate from dual
 12    union all
 13    SELECT 'I' AS "MODE", 'V2987654321' AS  Vehicle, '1411185798' AS OrderCode, to_date('2014-11-20 00:47:02','yyyy-mm-dd hh24:mi:ss') AS ActionDate FROM dual
 14  )
 15  SELECT "MODE",
 16    Vehicle,
 17    OrderCode,
 18    TO_CHAR(ActionDate,'yyyy-mm-dd hh24:mi:ss') dt,
 19    TO_CHAR(LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate),'yyyy-mm-dd hh24:mi:ss') lag_dt,
 20    ActionDate - LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate) diff
 21  FROM t;

M VEHICLE     ORDERCODE  DT                  LAG_DT                    DIFF
- ----------- ---------- ------------------- ------------------- ----------
I V1234567890 1411196232 2014-11-19 15:27:09
O V1234567890 1411196232 2014-11-19 16:34:35 2014-11-19 15:27:09 .046828704
I V2987654321 1411185798 2014-11-20 00:47:02
O V2987654321 1411185798 2014-11-20 01:40:58 2014-11-20 00:47:02 .037453704
I V2987654321 1411206614 2014-11-20 13:47:02
O V2987654321 1411206614 2014-11-20 14:03:02 2014-11-20 13:47:02 .011111111

6 rows selected.

SQL>
Run Code Online (Sandbox Code Playgroud)

注意: WIT ​​H 子句用于构建示例数据,在您的情况下,您需要使用实际的table_name

SELECT "MODE",
  Vehicle,
  OrderCode,
  TO_CHAR(ActionDate,'yyyy-mm-dd hh24:mi:ss') dt,
  TO_CHAR(LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate),'yyyy-mm-dd hh24:mi:ss') lag_dt,
  ActionDate - LAG(ActionDate) OVER(PARTITION BY Vehicle,OrderCode ORDER BY Vehicle, ActionDate) diff
FROM your_table;
Run Code Online (Sandbox Code Playgroud)

我放置TO_CHAR只是为了演示目的,您所需的输出是DIFF列。关于MODE,您可以将其添加到过滤谓词中。