sql - 如何将一行削减到开始时间和结束时间到多天花费的小时行

标签 sql oracle

问题:

如何将开始时间和结束时间的一行剪切为多天花费小时的行

表数据和 DDL:

starttime           , endtime
2019/05/03 08:00:00 , 2019/05/05 12:00:00
CREATE TABLE T  ("starttime" timestamp, "endtime" timestamp);
INSERT  INTO T ("starttime", "endtime") VALUES ('03-May-2019 08:00:00 AM', '05-May-2019 12:00:00 PM');

预期结果:

Date        , SpendHour
2019/05/03 , 16
2019/05/04 , 24
2019/05/05 , 12
Online Demo Link | DB Fiddle

最佳答案

您可以使用 connect by level <=语法结合 case..when声明

select trunc(t.starttime+level-1) as "Date", 
       case 
       when trunc(t.starttime+level-1) = trunc(t.starttime) then
            extract(hour from trunc(t.starttime+level)
                  -greatest(t.starttime,trunc(t.starttime+level-1)))     
       when trunc(t.starttime+level-1) = trunc(t.endtime) then     
            extract(hour from t.endtime-trunc(t.endtime))
       else
            24     
       end as "Spend hour"   
  from t
 connect by level <= extract(day from t.endtime - t.starttime)+1;

Demo

关于sql - 如何将一行削减到开始时间和结束时间到多天花费的小时行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55964111/

相关文章:

相当于 WM_CONCAT 函数的 SQL Server

Oracle 堆栈跟踪行号与源代码不匹配!

mysql - TO_DATE 从 DD-MON-YY 到 YYYYMMDD

java - 关于可序列化事务的一些疑问?

c# - 日期时间格式不正确?

sql - 包含特定字符的记录列表的最佳 SQL 查询?

sql - MySQL 'IN'子句及返回的记录集顺序

mysql - SQL返回不同相关实体数量大于1的结果

mysql - 如何解析json对象 - mysql

java - 从存储过程返回的 STRUCT 中读取 ARRAY