使用type和datestamps减去工作流表中的日期

时间:2016-06-23 13:39:34

标签: oracle sqlplus

我有一个包含3列的表格:

FOR %%A IN (Team.txt) DO Find "%%A" *.csv > result.txt

该表用于跟踪工作流中的步骤,并且特定渣油可以存在多个具有不同类型ID(数字)和日期戳的特定渣油。 我想计算两次换档之间的时间 - 即,特定渣油上的1和17

我尝试过像这样的sql-plus语法 并尝试使用别名: 有什么建议吗?

resid      type        date

2 个答案:

答案 0 :(得分:1)

SELECT a.resid, a."type" type1, a."date" date1, b."type" type17, b."date" date17, b."date" - a."date" AS date_diff
  FROM tablename a JOIN tablename b ON a.resid = b.resid AND b."type" = '17'
 WHERE a."type" = '1' AND a.resid = :resid

请不要使用oracle保留字作为列名。 当(渣油,类型)是唯一的时,您可以这样做:

SELECT :resid resid, 
      (select "date" FROM tablename WHERE resid = :resid AND "type" = '17') -
      (select "date" FROM tablename WHERE resid = :resid AND "type" = '1') date_diff
  FROM DUAL

答案 1 :(得分:1)

您的尝试查询在in之前的列列表周围缺少括号 - 因此应该是where (resid, date in) - 但也有and where无效,可能还有其他问题。大多数情况下它并不能满足您的需求,尤其是因为两个date值来自同一行(对于类型1),因此减去它们将始终为零。

您可以使用条件聚合:

select resid,
  min(case when type_id = 17 then date_stamp end)
    - min(case when type_id = 1 then date_stamp end) as diff
from tablename
where type_id in (1, 17) -- optional
and resid = :some_value
group by resid;

case为每个匹配行提供null或日期戳;聚合然后从那些中给出一个值(有利于非空的)。

如果只存在其中一个类型ID,那么差异将为空。

如果可能有倍数,您可能希望将17的min()更改为max() - 取决于您真正需要的内容。

快速演示:

with tablename(resid, type_id, date_stamp) as (
  select 1, 1, sysdate - 10 from dual
  union all select 1, 17, sysdate - 7 from dual
  union all select 2, 1, sysdate - 5 from dual
  union all select 2, 17, sysdate - 3 from dual
  union all select 3, 1, sysdate - 10 from dual
)
select resid,
  min(case when type_id = 17 then date_stamp end)
    - min(case when type_id = 1 then date_stamp end) as diff
from tablename
where type_id in (1, 17) -- optional
--and resid = 2
group by resid;

     RESID       DIFF
---------- ----------
         1          3
         2          2
         3