Oracle,将持续时间行拆分为一小时

Posted

技术标签:

【中文标题】Oracle,将持续时间行拆分为一小时【英文标题】:Oracle, split a time duration row by one hour period 【发布时间】:2013-09-16 05:40:18 【问题描述】:

我正在研究 oracle db,但我不太擅长 Oracle。 我正在尝试将一行拆分一小时。

例如,如果一个时间行已经给出如下,

开始时间(yyyy/mm/dd hh24:mi:ss) | End_time(yyyy/mm/dd hh24:mi:ss)

2013/09/01 09:30:00 2013/09/01 11:38:59

我想看到这样的结果:

2013/09/01 09:30:00 2013/09/01 09:59:59
2013/09/01 10:00:00 2013/09/01 10:59:59
2013/09/01 11:00:00 2013/09/01 11:38:59

我已经搜索了如何做到这一点,但我找不到。 但我想这可以通过使用'CONNECT BY'来完成。 任何帮助都会很棒。提前致谢。

【问题讨论】:

检查这个:***.com/questions/17035176/… @rags 感谢您的链接,但它涉及日期。我正在寻找如何将一行拆分为一小时。 【参考方案1】:

我已经建立了一个基本查询,你可以解决它并得到你想要的。

select greatest(Start_time, trunc(Start_time+(level-1)/24, 'hh24')), 
least(End_time, trunc(Start_time+(level)/24, 'hh24'))
from log_table 
connect by level <= floor((dt1-dt2)*24)+1;

sqlfiddle 示例:

http://sqlfiddle.com/#!4/82625/29

【讨论】:

谢谢玛尼。你的帮助很好地暗示了我想要的结果。【参考方案2】:

查询的略微修改版本。较早的查询在某些情况下不起作用,例如从日期/时间是凌晨 2:37,到现在是早上 6:10。

WITH date1 AS (
  SELECT to_date('2017-07-26 02:37:00 AM','yyyy-MM-dd hh12:mi:ss am') dt2,
         to_date('2017-07-26 06:10:00 PM','yyyy-MM-dd hh12:mi:ss am') dt1 FROM DUAL
)
select TO_CHAR (greatest(dt2, trunc(dt2+(level-1)/24, 'hh24')),
    'dd-MON-yyyy HH12:MI:SS AM') FROM_DT,
    TO_CHAR (  least(dt1, trunc(dt2+(level)/24, 'hh24'),
    'dd-MON-yyyy HH12:MI:SS AM') TO_DT
    from date1 connect by level <= floor(
        (trunc(dt1,'HH')-trunc(dt2,'HH'))  *24) + case when (
             dt1 <> trunc(dt1,'HH')
        ) then 1 else 0 end

【讨论】:

以上是关于Oracle,将持续时间行拆分为一小时的主要内容,如果未能解决你的问题,请参考以下文章

根据持续时间将行拆分为多行

Excel:将持续时间(小时、分钟、秒)转换为 6 分钟的增量

SQL ORACLE 从多个日期时间行中获取周数

将持续数天的 NSDate 拆分为几个跨度

Google将工作时间设置为秒

Oracle 11 SQL:有没有办法将 1 行拆分为 x 行