我想知道是否有人能帮我?
我有一个PHP员工时间表,通过输入开始和结束时间来跟踪他们的工作时间,代码如下;
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Type Month/Date/Year" title="Type Month/Date/Year">
<table id="myTable">
<tr class="header">
<th scope="col">Date</th>
<th scope="col">Start Time</th>
<th scope="col">End Time</th>
<th scope="col">Activity</th>
</tr>
<?php foreach($activity as $user_activity) { ?>
<tr>
<td scope="row"><?php echo $user_activity['date']; ?></td>
<td><?php echo $user_activity['start_time']; ?></td>
<td><?php echo $user_activity['end_time']; ?></td>
<td><?php echo $user_activity['activity']; ?></td>
</tr>
<?php } ?>
</table>
</div>
<form method="post" action="index.php">
<div class="form-row">
<input type="hidden" name="user_id" value="<?php echo $_SESSION['id']; ?>">
<div class="form-group col-md-4">
<label for="inputEmail4">Start time</label>
<input type="time" class="form-control" id="inputEmail4" name="start_time" required>
</div>
<div class="form-group col-md-4">
<label for="inputPassword4">End Time</label>
<input type="time" class="form-control" id="inputPassword4" name="end_time" required>
</div>
</div>
<div class="form-group">
<label for="inputAddress">Activity Details</label>
<!-- <input type="text" class="form-control" name="activity"> -->
<textarea name="activity" id="" cols="30" class="form-control" rows="5"></textarea>
</div>
<button type="submit" class="btn btn-primary">Add</button>
</form>
</div>
我是否可以生成一份报告,并获得每个员工在4周内的总工作时间?
非常感谢:(
假设您的开始和结束时间是时间类型,而日期是日期类型,则看起来如下:http://sqlfiddle.com/#!9/69b9c4/4
架构:
create table task_activity (id int, user_id int, start_time time, end_time time, activity varchar(255), occur_date date, primary key(id));
insert into task_activity values (1, 1, '12:00', '14:00', 'activity', '2020-07-06');
insert into task_activity values (2, 1, '8:00', '10:00', 'activity', '2020-07-03');
insert into task_activity values (3, 1, '8:00', '10:00', 'activity', '2020-06-03');
insert into task_activity values (4, 2, '8:00', '16:00', 'activity', '2020-07-06');
我创建了表,2个用户:用户id:1有3个工作条目。7月6日12:00至14:00,7月3日8:00至10:00。还有6月3日8:00-10:00的入场券(不应计算在内,因为这超过了4周(。第二个用户id:2有一个条目。7月6日8:00至16:00。
现在查询:
select user_id, hour(sec_to_time(sum(time_to_sec(end_time) - time_to_sec(start_time)))) as hours_worked, count(id) as activities
from task_activity
where occur_date between (now() - interval 4 week) and now()
group by user_id
重要部件:
- 按user_id分组,因为我们希望将每个用户的数据列为单个报告行
- hours_worked列:我们从end_time中减去start_time的秒数,对这些值求和,然后转换回时间。然后,正如你所问的那样,我们只显示该时间跨度的小时值
- where删除不在最近4周内的所有日期
- 为了便于演示,还有一些活动列显示了每个用户考虑了多少不同的活动
结果:
| user_id | hours_worked | activities |
|---------|--------------|------------|
| 1 | 4 | 2 |
| 2 | 8 | 1 |
用户1在此期间工作了4个小时(我们根据他的2个工作日志条目计算,跳过了一个,因为它太旧了(。
用户2工作了8个小时(根据单个条目计算(。
我希望该表只有两个日期时间列:开始和结束,但您没有这种设置。
我也没有考虑重叠的工作日志(例如,同一用户在同一天记录两次相同的时间(,但我认为这超出了这个问题的范围,可以在添加条目时进行验证。