我想捕获两个时间戳之间的差异,输出以每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发现者进行的。 这里的任何建议都将非常感激。
答案 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,则可以从数据库中提取。