Laravel Carbon - 计算数据库条目之间的时间

时间:2017-11-24 11:03:14

标签: laravel php-carbon

我正在尝试计算两个日期时间之间的差异。

我有两个模型taskstask_interactions,它们是这样的:tasks有很多task_interactions,而task_interactions属于{{1} }}

用户可以将任务的状态更改为以下之一:“正在进行”,“已暂停”和已完成。用户在“进行中”和“已暂停”之间多次更改状态,但一旦完成,用户就无法再更改任务状态。

所有互动都保存在tasks表格中,task_interactions为user_id,created_by为日期时间。该表包含以下列:created_at

这是任务id = 1的例子:

id ; task_id ; status ; comments ; created_by ; created_at

问题是,对于我在一项任务中花费的总时间,我必须确定# id, task_id, status, comments, created_by, created_at 144, 1, In Progress, , 1, 2017-11-14 09:42:20 145, 1, Paused, , 1, 2017-11-14 09:45:53 146, 1, In Progress, , 1, 2017-11-14 09:46:57 147, 1, Paused, , 1, 2017-11-14 09:49:57 148, 1, In Progress, , 1, 2017-11-14 10:00:10 149, 1, Paused, , 1, 2017-11-14 10:06:25 150, 1, In Progress, , 1, 2017-11-14 10:07:26 151, 1, Paused, , 1, 2017-11-14 10:08:11 153, 1, Paused, , 1, 2017-11-14 11:27:04 154, 1, In Progress, , 1, 2017-11-14 11:27:21 155, 1, Paused, , 1, 2017-11-14 11:57:38 In Progress之间的时间。 PausedPaused之间的时间无关紧要。

我对此很感兴趣。有没有人可以帮助我?

提前致谢。

还有一件事,我不是很有经验,所以请原谅,如果我的问题听起来有些笨拙,我相信我应该在所有task_interactions中执行In Progress循环,其中task_id = X,这就是我所知道的

如所询问的,这是我传递给视图的数据:

@foreach

还有一件事,我到目前为止所知道的

public function mytasks()
    {
        $users = User::all();
        $mytasks = Task::where('assigned_to','=', Auth::id())->where('status','!=','Finished')->get(); 
        $mytaskscount = Task::where('assigned_to','=', Auth::id())->count();
        $tasksinprogress = Task::where('status','=','In Progress')->where('assigned_to','=', Auth::id())->get();
        $tasksinprogresscount = Task::where('status','=','In Progress')->where('assigned_to','=', Auth::id())->count();
        $taskspaused = Task::where('status','=','Paused')->where('assigned_to','=', Auth::id())->get();
        $taskspausedcount = Task::where('status','=','Paused')->where('assigned_to','=', Auth::id())->count();
        $tasksfinished = Task::where('status','=','Finished')->where('assigned_to','=', Auth::id())->get();
        $tasksfinishedcount = Task::where('status','=','Finished')->where('assigned_to','=', Auth::id())->count();
        $tasktypes = Tasktype::all();
        $chapters = Chapter::all();

        return view('pages.tasks_my', compact('mytasks','tasktypes','chapters','tasksinprogress','taskspaused','tasksfinished','mytaskscount','tasksinprogresscount','taskspausedcount','tasksfinishedcount'));
    }

我真的不知道如何做到这一点

2 个答案:

答案 0 :(得分:1)

这是严格的Mysql,但应该做的伎俩。 您可以使用原始sql指令直接在laravel中调用它,或者您应该将其重新编写为Laravel代码。

select SEC_TO_TIME(
    sum( 
        timediff(
            if(task_end.created_at is null, 
               NOW(), 
               task_end.created_at), 
            task_start.created_at)))
from task_interactions task_start
left join task_interactions task_end
    ON task_end.task_id = task_start.task_id
    AND task_end.status IN ('Pause', 'Finished')
    AND task_end.created_at = (
        SELECT min(created_at)
        FROM task_interactions
        WHERE status = task_end.status
        AND created_at >= task_start.created_at
    )
WHERE task_start.task_id = 1
AND task_start.status = 'In Progress'

答案 1 :(得分:0)

我会推荐大卫的回答。如果你不习惯使用MySQL。你可能必须这样做:

计算第一次任务开始时的差异&当它被暂停时:

$start = Carbon::parse($startTask->created_at);
$pause = Carbon::parse($endTask->created_at);

$diffInSeconds = $pause->diffInSeconds($start)

这应该可以为您提供任务开始时的总差异(以秒为单位)。然后停顿了一下。现在你必须重复这种方法,以便再次开始一项任务。然后停顿了一下。