如何用一条记录减去日期oracle

时间:2011-02-23 14:54:28

标签: sql oracle time

我有一个表格,其中包含日期格式的一列。我想计算两个记录之间的时差,你能帮帮我吗?我需要SQL或PL / SQL中的查询。

ORDER_ID;ORDER_STATUS_ID;ORDER_DATE
8296;16;22-2-2011 13:56:31
8295;22;22-2-2011 13:07:15

查询应该在00:49:45或接近此结果。

你能帮忙吗? THX!

BR

3 个答案:

答案 0 :(得分:2)

问题并不是你想要如何计算它 - 它是你想要它的显示方式。日期算术很简单:

select date2 - date1 from
    (select to_Date('22-2-2011 13:07:15','dd-mm-yyyy hh24:mi:ss') as date1,
            to_Date('22-2-2011 13:56:31','dd-mm-yyyy hh24:mi:ss') as date2
     from dual);

给出答案,但它是小数。那么如何将其转换为您的视觉显示?

select to_char(trunc(sysdate) + mod(date2 - date1,1),'hh24:mi:ss') from
    (select to_Date('22-2-2011 13:07:15','dd-mm-yyyy hh24:mi:ss') as date1,
            to_Date('22-2-2011 13:56:31','dd-mm-yyyy hh24:mi:ss') as date2
     from dual);

好的,现在格式很好。

哦,除非你真的想存储间隔怎么办?或者,如果间隔超过一天,则需要以不同方式对其进行格式化。

那么 - 您是否需要实际间隔用于其他目的?或者您只想以给定格式显示间隔?根据您的需要,将指导您的答案。

但间隔本身很容易。那只是减法。在你的情况下

select yt2.order_Date - yt1.order_date
from yourtable yt1, yourtable yt2
where yt1.order_id = 8295
and   yt2.order_id = 8296; 

答案 1 :(得分:2)

您可能会发现分析函数很有帮助。

SELECT order_id,
       order_date,
       order_date - LAG(order_date) OVER (ORDER BY order_id) time_since_last_order
  FROM order_table
  WHERE order_id IN (8295,8296) -- or whatever set of orders you're really interested in
  ORDER BY order_id;

这样可以避免连接两行所需的自连接。

除此之外,迈克尔的回答也很好。

答案 2 :(得分:0)

结帐this site。根据您使用的是DATE还是TIMESTAMP字段,您需要编写的查询会有所不同。

如果这是一项重要功能,并且您希望降低创建查询的难度,则可以考虑切换到TIMESTAMP字段,如果可能的话。