计算已完成的工作时间
嗨我正在制作一个模块,用于计算指定班次内用户的总工时数。计算已完成的工作时间
例如$start = strtotime("15:00");
这是当天的3pm 2015-07-21
和$end = strtotime("06:00");
6am 2015-07-22
。我如何根据他们的登录和注销来计算他们的工作时间?我使用Laravel 5
我做了一个表loginhours
具有这种结构,
loginhours
->id
->user_id
->loginhours
->date
->timestamp
->status
,但并没有作出任何的逻辑是如何做到这一点,那些表中的列可能我什么,我需要记录的东西或做任务。如果你有建议,你可以*分享。基本上,他们可以在班次期间登录和注销,只需更新loginhours
列。因此,例如,他们用的2015-07-21 03:00:00
时间戳这是3pm
那么如果他们退出的4pm
登录他们的登录小时1.0
然后将其在7pm
再次登录,并在5am of 2015-07-21
注销那么这将是他们以前的登录时间是1.0
+ 10.0
因为7pm 2015-07-20 - 5am 2015-07-21
。并且应该更新该用户的登录时间。
我想的检查是在postLogin()
和我AuthController
嘛getLogout()
,可以使用碳,我认为是捆绑在一起Laravel或者您可以使用PHP的日期时间(这是碳使用,我认为) 。如果我没有弄错,他们都会计算日期之间的时间差异。
http://php.net/manual/en/datetime.diff.php
和
我实现了这一点。我创建了work_order_sessions
,以便用户可以检入和检出工单,然后计算工单上的总工时。在你的情况下,你可以简单地创建一个会话记录,当工作人员登录时,设置开始时间,然后当他们注销时,找到他们的最后(打开)会话并设置结束时间。它需要一些原始MySQL来计算每个会话的小时差异,然后为每个用户添加总小时差异。这里有一个片段,并链接:
// Model WorkOrder.php
/**
* Retrieves all of the users work order
* sessions grouped by each user.
*
* @return mixed
*/
public function getUniqueSessions()
{
$select = "TRUNCATE(ABS(SUM(TIME_TO_SEC(TIMEDIFF(work_order_sessions.in, work_order_sessions.out))/3600)), 2) as total_hours";
$records = $this->sessions()
->select('user_id', DB::raw($select))
->groupBy('user_id')
->get();
return $records;
}
https://github.com/stevebauman/maintenance/blob/master/src/Models/WorkOrder.php#L428
模式:
Schema::create('work_order_sessions', function (Blueprint $table)
{
$table->increments('id');
$table->timestamps();
$table->integer('user_id')->unsigned();
$table->integer('work_order_id')->unsigned();
$table->dateTime('in');
$table->dateTime('out')->nullable();
$table->foreign('user_id')->references('id')->on('users')
->onUpdate('restrict')
->onDelete('cascade');
$table->foreign('work_order_id')->references('id')->on('work_orders')
->onUpdate('restrict')
->onDelete('cascade');
});