Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 复杂时间和_Php_Time - Fatal编程技术网

Php 复杂时间和

Php 复杂时间和,php,time,Php,Time,我正在尝试编写一个脚本,其中包含以下数据库条目: ╔════╦═════════╦════════╦══════════╗ ║ id ║ user_id ║ action ║ time ║ ╠════╬═════════╬════════╬══════════╣ ║ 1 ║ 1 ║ 1 ║ 12:00:00 ║ ║ 2 ║ 1 ║ 2 ║ 12:10:00 ║ ║ 3 ║ 1 ║ 1 ║ 18:00:00 ║ ║

我正在尝试编写一个脚本,其中包含以下数据库条目:

╔════╦═════════╦════════╦══════════╗
║ id ║ user_id ║ action ║   time   ║
╠════╬═════════╬════════╬══════════╣
║  1 ║       1 ║      1 ║ 12:00:00 ║
║  2 ║       1 ║      2 ║ 12:10:00 ║
║  3 ║       1 ║      1 ║ 18:00:00 ║
║  4 ║       1 ║      2 ║ 18:10:00 ║
╚════╩═════════╩════════╩══════════╝
然后计算出两个动作1和2之间的差值,然后将它们相加,这个例子总共是20:00

我真的不知道从哪里开始,似乎在网上找不到任何有帮助的东西

如果有人能给我指出正确的方向,我将不胜感激

编辑:其他操作可能在数据库1-7中,也可能在多个用户中

Edit2:下面的示例表更复杂,仍然会产生20:00的相同示例

讨论后SQL-FIDLE

-

SQL-FIDLE

这个查询做什么

同一张桌子用了两次。计算结果在外部选择中可用。 内部选择子查询执行以下操作: 计算时差t2-t1 当用户\u id为同一用户\u id=用户\u id时 但行id-1不同 结果就是时差 外部选择获取时间差并将其相加 现在,你得到的时间以秒为单位。 如果希望得到精确的结果“20:00”,可以将第一行更改为包含时间转换,如下所示:

SELECT user_id, TIME_FORMAT(SEC_TO_TIME(SUM(time_difference)),'%i') as time_spent
better
SELECT user_id, TIME_FORMAT(SEC_TO_TIME(SUM(time_difference)),'%Hh %im') as time_spent
要获取用户id花费的时间,可以添加

加入SELECT@DIS:=0RTAB1,其中用户id=1


SQL处理时间转换和WHERE user_id

这里有一个php端的方法,应该可以让您开始。假设$arrQueryResults是SELECT*from表中的DB结果集,按用户id、时间、操作使用适合您的DB的语法

$db = mysqli_connect("server", "username", "password", "database");
$query = "SELECT * FROM action WHERE date = '".$todaysDate."' ORDER BY user_id, time, action";
$result = mysqli_query($db, $query);

while ($arrResult = mysqli_fetch_assoc($result)) { // For each row in the query result
    $user=$arrResult['user_id'];
    $time=strtotime($arrResult['time']); // Converts H:M:S to an integer timestamp
    $action=$arrResult['action'];

    // Add the timestamp for this user and action to track until we have a matched pair
    if ($action == '2') {
        $arrUserAction[$user][$action]=$time;
    }

    if ($action == '5' && isset($arrUserAction[$user]['2'])) {
        if (!isset($arrDiffSums[$user])) {  // If we have no running total for the user yet, create one.
            $arrDiffSums[$user]=$time - $arrUserAction[$user]['2'];
        } else { // IF we have a total for the user already, add to it.
            $arrDiffSums[$user]=$arrDiffSums[$user] + ($time - $arrUserAction[$user]['2']);
        }
        unset($arrUserAction[$user]);  // We just added a sum, now remove our tracking to be ready for the next pair.
    } 
}
print_r($arrDiffSums);
这将导致用户使用secs生成$arrDiffSums。在第二个表格示例中:

array(
  '1' => 1200,
  '2' => 1200,
  '3' => 600
)
可以使用gmdate转换为H:M:S或其他格式:


也许试着把时间戳存储得比日期时间多一些,你可以轻松地在上面进行更多的计算。我们怎么知道应该比较12:00:00和12:10:00,而不是12:00:00和18:10:00?在这两种情况下,我们都会将user_id=1和action=1与user_id=1和action=2进行比较。另外,是否有第三次行动的可能性?如果是这样的话,你希望如何考虑这一点?@PatrickQ确切地说,这就是我一直坚持的。。。在做数学运算之前,我需要某种方式对它们进行排序。那么其他用户呢?他们的时差应该加在一起吗?或者您想要每个用户的总和?我认为这里有很多细节需要你仔细分析,或者如果你已经这样做了,那么在你问这个问题之前,在这里解释一下。@PatrickQ在我的实际数据库中,实际上有7个动作,因此,1和2的选择也需要合并。如果一个用户在另一个用户的操作之间执行一个操作怎么办?我认为这不相关,因为计算只在用户id相同且按用户id分组的情况下执行。或者换句话说,时间计算是按每个用户进行的。不相关是什么意思?你是说那些记录不相关吗?我猜OP不会同意。假设id/user\u id/action/time,假设我们有1/1/1/12:00:00、2/2/1/12:05:00和3/1/2/12:10:00行。第一个id和最后一个id之间的差值大于1,但仍应计算操作次数之间的差值。这将导致用户\u id 1的值为10m-用户\u id 2没有第二个时间事件时间\u持续时间进行计算。真正地user1仍然是10:00,而它应该是20:00。问题是您在t1.id=t2.id-1上使用了。除非这是一个非常奇怪的应用程序,否则我怀疑我们是否可以假设它一次只能由一个用户使用。我现在正试图实现它,这段代码对我来说非常高级,所以请原谅新手的问题。。。首先,我应该在哪里打印结果?在外面还是里面?这个问题可以吗$query=mysql\u querySELECT*FROM action,其中date=$todaysDate按用户id、时间、操作排序;虽然$row=mysql\u fetch\u assoc$query{$arrQueryResults[]=$row[time];}进行了更新,以使您更接近使用mysqli\u,而不是使用不推荐使用的mysql\u驱动程序。正如@Patrick Q指出的,这其中有大量假设。启动/停止操作是否始终按顺序进行?用户可以同时执行多个操作吗?如果这些是时钟时间,您有多确定没有一个序列重叠一天的边界?即开始23:50:00停止00:10:00=20:00。想一想这类事情。是的,我应该更清楚地开始,我是stackoverflow的新手,而不是你可能看到的PHP专家。用户不能同时执行多个操作,在这种情况下,用户在一天的变化中不会重叠。它现在已经实现了,似乎正在恢复,我唯一需要做的就是将操作1和2更改为操作2和5。看着你的代码,我似乎看不到我可以在哪里更改它?我的荣幸,祝你好运,请向任何因为现在21:00休息而遇到麻烦的人表示歉意:
$db = mysqli_connect("server", "username", "password", "database");
$query = "SELECT * FROM action WHERE date = '".$todaysDate."' ORDER BY user_id, time, action";
$result = mysqli_query($db, $query);

while ($arrResult = mysqli_fetch_assoc($result)) { // For each row in the query result
    $user=$arrResult['user_id'];
    $time=strtotime($arrResult['time']); // Converts H:M:S to an integer timestamp
    $action=$arrResult['action'];

    // Add the timestamp for this user and action to track until we have a matched pair
    if ($action == '2') {
        $arrUserAction[$user][$action]=$time;
    }

    if ($action == '5' && isset($arrUserAction[$user]['2'])) {
        if (!isset($arrDiffSums[$user])) {  // If we have no running total for the user yet, create one.
            $arrDiffSums[$user]=$time - $arrUserAction[$user]['2'];
        } else { // IF we have a total for the user already, add to it.
            $arrDiffSums[$user]=$arrDiffSums[$user] + ($time - $arrUserAction[$user]['2']);
        }
        unset($arrUserAction[$user]);  // We just added a sum, now remove our tracking to be ready for the next pair.
    } 
}
print_r($arrDiffSums);
array(
  '1' => 1200,
  '2' => 1200,
  '3' => 600
)
foreach ($arrDiffSums as $user => $secs) {
     print "User: ".$user." Sum: ".gmdate("H:i:s", $secs)."\n";
}