我正在尝试计算两个日期时间之间的差异。
我有两个模型tasks
和task_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
之间的时间。 Paused
和Paused
之间的时间无关紧要。
我对此很感兴趣。有没有人可以帮助我?
提前致谢。
还有一件事,我不是很有经验,所以请原谅,如果我的问题听起来有些笨拙,我相信我应该在所有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'));
}
我真的不知道如何做到这一点
答案 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)
这应该可以为您提供任务开始时的总差异(以秒为单位)。然后停顿了一下。现在你必须重复这种方法,以便再次开始一项任务。然后停顿了一下。