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,将持续时间行拆分为一小时的主要内容,如果未能解决你的问题,请参考以下文章