您好我正在制作一个模块,用于计算用户在指定班次内完成的小时工作量。
例如$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
的{{1}}时间戳登录,然后如果他们在3pm
注销,他们的登录时间为4pm
,那么他们会再次登录1.0
然后退出7pm
,这将是他们之前的登录时间5am of 2015-07-21
+ 1.0
,因为10.0
。并且应该更新该用户的loginhours。
我希望检查位于我7pm 2015-07-20 - 5am 2015-07-21
的{{1}}和postLogin()
答案 0 :(得分:2)
好吧,你可以使用我认为与Laravel捆绑在一起的Carbon,或者你可以使用PHP DateTime(我认为这是Carbon使用的)。如果我没有弄错的话,他们都会计算日期之间的时差。
http://php.net/manual/en/datetime.diff.php
和
答案 1 :(得分:0)
我实现了这一点。我创建了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');
});