php - 使用 foreach 循环添加 DateTime 间隔
问题描述
昨天我在将日期时间间隔加在一起时问了一个问题,并被指向这个线程-我们如何在 PHP 中添加两个日期间隔
这很棒而且很有意义。但是,当我尝试foreach
循环执行提交的答案时,我得到的结果不正确。
这是我制作的一个函数,它可以获取员工的所有时间和时间,它们存储在数据库中并使用 PHP 的日期(H:i:s)创建。
我的功能获取任何给定员工的所有进出时间,我正在处理的报告功能需要显示他们工作的总小时数。
我试图通过将时间转换为 datetime 对象并使用 ->diff 来获取间隔并因此计算该天的小时数来实现这一点,然后我尝试使用foreach
循环将间隔相加在一起,从而给我工作时间的总和在任何给定的日期范围内。
整个功能是这样的:
function getTotalHours($staff_id,$from_date,$to_date){
$sql = "SELECT * FROM oc_staff_times WHERE date BETWEEN '$from_date' AND '$to_date' AND staff_id = '$staff_id'";
$result = $this->conn->query($sql);
if ($result->num_rows > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$data[] = $row;
}
$base_time = new DateTime('00:00');
$total = new DateTime('00:00');
foreach ($data as $time) {
$in = new DateTime($time['clock_in_time']);
$out = new DateTime($time['clock_out_time']);
$interval = $in->diff($out);
$base_time->add($interval);
}
return $total->diff($base_time)->format("%H:%I");
}
}
我希望得到一个每月的总数,但是我的最终结果似乎只有一天。这是 UI 的屏幕截图(总小时数被粗略圈出),这也显示了我的函数应该添加在一起的时间戳。
解决方案
Qirel 的答案提供了一种在 SQL 中执行此操作的好方法,但是如果您想了解为什么您的代码不起作用:
$base_time = new DateTime('00:00');
不创建间隔,它是一个日期。这意味着如果您添加 24 小时并仅询问时间部分,它将显示“00:00”,因为您在第二天结束。
一种解决方案是声明$base_time
为间隔,例如:
$base_time = new DateInterval('PT0S');
最后直接输出如下:
$base_time->format("%H:%I");
推荐阅读
- r - R - 最小二乘均值对比单向方差分析
- excel - 通过条件格式每隔 n 行比较两个单元格
- c# - 如何订阅 Blazor.Radzen DialogService onClose 事件
- javascript - 如何在 React 中以最有效的方式重用 html bloc(其中包含 props.state)
- sql - 组内的 SQL Server 查询 case 语句
- python - 转换数据 | 熊猫
- c - C - if 中的睡眠功能
- python - 如何在第一次出现值后屏蔽/拆分 Tensorflow 数组
- android - 如何实现 Firebase 查询以查找 firebase 数据库子项的最大值?
- prolog - 合并两个没有重复的列表序言