【问题标题】:How to calculate hours on certain day, based on timestamps?如何根据时间戳计算某天的小时数?
【发布时间】:2020-07-22 13:22:11
【问题描述】:

我的数据库中有一个包含用户会话的表。有两列称为started_atended_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');
}

这行得通,但计算它需要相当多的时间。有没有更有效或更简单的方法来做到这一点?

【问题讨论】:

标签: php mysql laravel


【解决方案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);

【讨论】:

  • 这样快很多吗?
  • 试试这个并检查
  • 我会这样做!
  • 此外,如果您的 Session 模型在迁移中具有适当的数据类型,或者您在模型中设置了强制转换,则 get() 的结果将具有 started_atended_at 已经作为 Carbon实例,因此此解决方案可能会将 Carbon 实例转换为 Carbon 实例,从而增加开销。即)你也许能做到,$session->started_at->diffInHours($session->ended_at)
  • @Kurt Friars,那么它可以通过$diff = $session->started_at->diffInHours($session->ended_at);更轻松地完成
【解决方案2】:

如果您不在乎周一晚上 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'

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 2020-08-13
    • 2019-01-15
    • 2012-02-03
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2018-07-08
    • 2011-05-31
    相关资源
    最近更新 更多