2017-11-11 105 views
0

我想知道如何获得当前日期中两个日期之间的确切小时数。如何将开始/结束数据的总小时/天分组(每天有多个条目,有些过夜)?

我的表;

id | start  | s_clock | finish  | f_clock 
--------------------------------------------------- 
1 | 2017-11-10 | 22:00  | 2017-11-11 | 03:00 
2 | 2017-11-11 | 09:00  | 2017-11-11 | 10:00 

预期结果:

day  | total_hours 
-------------------------- 
2017-11-10 | 02:00   -- sum of all hours spent on 2017-11-10 
2017-11-11 | 04:00   -- sum of all hours spent on 2017-11-11 

感谢您的帮助。

+0

检查您的开始日期是结束一天的前一天。如果这样加在一起:从s_clock到24:00的增量+从0:00到f:时钟的增量。如果不是这样,简单的计算增量从f_clock到s_clock。如果出现问题,请显示您的SQL。 –

+0

2017-11-11为什么要给你4点? 9:00到10:00之间只有1个小时。查看我对最后评论SQL代码的回答。 –

+0

感谢您的帮助。我想在00:00至03:00(2017-11-11)之间找到3小时,9:00至10:00之间为1小时(2017-11-11)= 2017-11-共4小时, 11 – Veridigital

回答

0

您应该避免使用reserved keywords作为表或字段名称。

start就是其中之一。

create table times (startt date, s_time time, finish date, f_time time); 

insert into times 
values 
("2017-11-10" , "22:00", "2017-11-11" , "03:00"), 
("2017-11-11" , "09:00", "2017-11-11" , "10:00"); 

select time(sum(delta_on_day)),on_day -- comment line to see ungrouped results 
from -- comment line to see ungrouped results 
( -- comment line to see ungrouped results 
    (
    select * 
    , timediff(time("24:00"), s_time) as delta_on_day  
    , startt as on_day 
    from times 
    where startt < finish 
) 
    UNION ALL 
    (
    select * 
    , timediff(f_time, time("0:0")) as delta_on_day  
    , finish as on_day 
    from times 
    where startt < finish 
) 
    UNION ALL 
    (
    select * 
    , timediff(f_time, s_time) as delta_on_day  
    , startt as on_day 
    from times 
    where startt = finish 
) 
) as tbl -- comment line to see ungrouped results 
group by on_day -- comment line to see ungrouped results 

看到小提琴:http://sqlfiddle.com/#!9/189e21f/38

+0

太棒了!谢谢你节省我的时间。 – Veridigital

相关问题