2

我正在研究 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'来完成。
任何帮助都会很棒。提前致谢。

4

2 回答 2

2

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

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

于 2013-09-16T07:16:18.280 回答
0

查询的略微修改版本。较早的查询在某些情况下不起作用,例如从日期/时间是凌晨 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
于 2017-07-26T17:57:34.833 回答