每小时时间块中捕获的时间戳之间的差异

时间:2014-06-16 11:31:57

标签: sql time oracle10g timestamp intervals

我想捕获两个时间戳之间的差异,输出以每24小时时间段的分钟数显示。

E.g。

数据 - START - 01 May 2014 23:56:00 ---- END-02 May 2014 01:04:00

输出需要E.G - 23小时-4分钟,0小时 - 60分钟; 1小时-4分钟..

我已经设法通过为每个24小时时间块创建案例陈述来计算与上述输出类似的结果,但是并非所有时间都被捕获,特别是对于2个日历日的某些差异。时间戳之间的最大差异将是23小时和59分钟。

这是通过oracle发现者进行的。 这里的任何建议都将非常感激。

1 个答案:

答案 0 :(得分:0)

如果它们是TIMESTAMP,那么您可以使用TIMESTAMPs算法产生INTERVAL DAY TO SECOND数据类型的事实。如果超过2天,TRUNC(<end_date>)将提供午夜之间的日期。

SQL> with the_data as (
  2   select to_timestamp('2014-05-01 23:56:00','yyyy-mm-dd hh24:mi:ss') as s
  3        , to_timestamp('2014-05-02 01:04:00','yyyy-mm-dd hh24:mi:ss') as e
  4     from dual
  5    union
  6   select to_timestamp('2014-05-01 23:56:00','yyyy-mm-dd hh24:mi:ss') as s
  7        , to_timestamp('2014-05-01 23:57:00','yyyy-mm-dd hh24:mi:ss') as e
  8     from dual
  9          )
 10  select case when trunc(e) = trunc(s) then e - s
 11              else trunc(e) - s
 12         end as day1
 13       , case when trunc(e) = trunc(s) then null
 14              else e - trunc(e)
 15         end as day2
 16    from the_data;

DAY1                           DAY2
------------------------------ ------------------------------
+000000000 00:01:00.000000000
+000000000 00:04:00.000000000  +000000000 01:04:00.000000000

您需要CASE语句,因为您需要执行不同的操作,具体取决于您的时间戳是否在同一天。如果您的数据类型实际上是DATE,那么您最终会得到几天作为返回的数据类型

SQL> with the_data as (
  2   select to_date('2014-05-01 23:56:00','yyyy-mm-dd hh24:mi:ss') as s
  3        , to_date('2014-05-02 01:04:00','yyyy-mm-dd hh24:mi:ss') as e
  4     from dual
  5    union
  6   select to_date('2014-05-01 23:56:00','yyyy-mm-dd hh24:mi:ss') as s
  7        , to_date('2014-05-01 23:57:00','yyyy-mm-dd hh24:mi:ss') as e
  8     from dual
  9          )
 10  select case when trunc(e) = trunc(s) then e - s
 11              else trunc(e) - s
 12         end as day1
 13       , case when trunc(e) = trunc(s) then null
 14              else e - trunc(e)
 15         end as day2
 16    from the_data;

      DAY1       DAY2
---------- ----------
0.00069444
0.00277777 0.04444444

然后,您可以通过将此分数添加到当前SYSTIMESTAMP然后将其删除来将其转换为小时数和分钟数。

select systimestamp + case when trunc(e) = trunc(s) then e - s
                           else trunc(e) - s
                      end 
       - systimestamp as day1
     , systimestamp + case when trunc(e) = trunc(s) then null
                           else e - trunc(e)
                      end 
       - systimestamp
  from the_data;

这是有效的,因为您创建了超过当前时间戳的正确分钟数,然后再次将其删除。但是,因为TIMESTAMP算法导致INTERVAL DAY TO SECOND,所以你已经将它转换为正确的格式。

最好将数据存储在最适合它的数据类型中。如果您想要format this differently,则可以从数据库中提取。