我的数据库中有一个包含用户会话的表。有两列称为started_at
和ended_at
。它们都包含时间戳。现在,我需要做的是计算一周中给定日期的小时数。因此,最终,我需要返回所有课程中的所有内容,其中350小时在星期一进行,而250小时在星期二进行,依此类推。
我尝试使用下面的代码来做到这一点。
$day = 0;
$dayTofetch = "mon";
$sessions = Session::whereRaw('WEEKDAY(sessions.started_at) = '.$dayTofetch)->get();
foreach($sessions as $session) {
$started_at_date = new DateTime($session->started_at);
$ended_at_date = new DateTime($session->ended_at);
$diff = $date2->diff($date1);
$day = $day + $diff->format('%h');
}
这可行,但是要花很多时间才能计算出来。有更有效或更简便的方法吗?
答案 0 :(得分:1)
含碳:
use Carbon\Carbon;
$started_at_date = new Carbon($session->started_at);
$ended_at_date = new Carbon($session->ended_at);
$diff = $started_at_date->diffInHours($ended_at_date);
答案 1 :(得分:0)
如果您不在意将周一晚上11点至周二凌晨1点的会话计为周一的2个总小时:
select
SUM( CASE WHEN date_format(started_at,'%W') = 'Monday' THEN time_to_sec( TIMEDIFF( ended_at, started_at ) / (60 * 60) ELSE 0 END) as monday_hours,
SUM( CASE WHEN date_format(started_at,'%W') = 'Tuesday' THEN time_to_sec( TIMEDIFF( ended_at, started_at ) / (60 * 60) ELSE 0 END) as tuesday_hours,
etc
from your_table
where user_id = 'userX'