【问题标题】:How to group total hours/day for start/finish data (multiple entries per day, some crossing midnight)?如何为开始/完成数据分组总小时数/天(每天多个条目,一些跨越午夜)?
【发布时间】:2017-11-11 09:27:26
【问题描述】:

我想知道如何获取当前日期中两个日期之间的确切小时数。

我的桌子;

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

感谢您的帮助。

【问题讨论】:

  • 检查您的开始日是否是结束日的前一天。如果是这样相加:从 s_clock 到 24:00 的增量 + 0:00 到 f:clock 的增量。如果没有,简单计算从 f_clock 到 s_clock 的增量。如果出现问题,请显示您的 SQL。
  • 2017-11-11为什么要给你4:00? 9:00 到 10:00 之间只有 1 小时。请参阅我对最后一个 cmets SQL 代码的回答。
  • 感谢您的帮助。我想找到 00:00 到 03:00 之间的 3 小时(2017-11-11)+ 9:00 到 10:00 之间的 1 小时(2017-11-11)= 2017-11-总共 4 小时11

标签: mysql date datediff


【解决方案1】:

您应该避免使用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

【讨论】:

  • 太棒了!感谢您节省了我的时间。
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 2020-09-30
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 2021-09-23
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多