需要计算签到和签退时间之间的总小时数。

3
我正在尝试在我的数据库中创建一个签入/签出表。 我的签入表单可以正常工作,将时间插入到我的数据库中。 但当我尝试签出时出现问题。 在第一次输入时一切都很好...

enter image description here

但是当我尝试再次签入和签出时,会发生这种情况...

enter image description here

到目前为止一切都很好,但是当我结账时...... enter image description here 目前,我的代码更新所有匹配的child_idout列和totalTime列。 这是我的代码:
// Select the correct child from the database
$sql_childID = "SELECT id FROM child
                WHERE firstName = '$childFirstName'
                AND lastName = '$childLastName'";
$result = $pdo->query($sql_childID);
$row = $result->fetch();
$var = $row['id'];

// Insert the check out time for the child
$query = "UPDATE checkinout
        SET `out` = :nowTime
        WHERE child_id = $var
        AND `in` IS NOT NULL";
$statement = $pdo->prepare($query);
$statement->bindValue(':nowTime', date("YmjHis"));
$statement->execute();

// Select check in time for specified child
$sql_inTime = "SELECT `in` FROM checkinout
        WHERE child_id = $var";
$inResult = $pdo->query($sql_inTime);
$inRow = $inResult->fetch();
$inTime = strtotime($inRow['in']);

// Select the check out time for specified child
$sql_outTime = "SELECT `out` FROM checkinout
        WHERE child_id = $var";
$outResult = $pdo->query($sql_outTime);
$outRow = $outResult->fetch();
$outTime = strtotime($outRow['out']);

// Find total hours
$totalTime = abs($outTime - $inTime)/(60*60);

// Update totalHours column for specified child
$queryTotalTime = "UPDATE checkinout
                SET totalTime = :totalTime
                WHERE child_id = $var
                AND 'out' IS NOT NULL";
$statement = $pdo->prepare($queryTotalTime);
$statement->bindValue(':totalTime', $totalTime);
$statement->execute();

child_id是用户的ID吗?如果是,那么有人如何在没有签出的情况下签入两次呢? - Chin Leung
我对PHP还很陌生,所以表单没有任何验证。你理论上可以签到两次。我正在尝试弄清楚插入签出时间和总工时的逻辑,而不会影响其他行。 - slickset
是的,child_id 是用户的 ID。在表单中,您将输入名字和姓氏,然后选择签到或签出孩子。 - slickset
让我编辑我的图片,使其更加准确... - slickset
所以你只想在结账时更新一条记录?如果是这样,我认为问题出在:AND in IS NOT NULL。这应该改成out而不是in吧? - David Aman
2个回答

3

我认为你可以在第一条更新语句中使用 TIMESTAMPDIFF 而不是用 PHP 计算总时间:

UPDATE checkinout
SET 
    out = NOW(),
    totalTime = TIMESTAMPDIFF(SECOND, `in`, NOW()) / 3600
WHERE
    child_id = $var
    AND out IS NULL

WHERE out IS NULL这个条件只会更新那些out列中还没有值的行。


谢谢,这段代码完美地满足了我的需求。 - slickset
不客气。我注意到在你接受了答案之后,我对其进行了编辑。编辑后的版本应该以与你当前格式相同的方式给出分数小时。 - Don't Panic
太棒了!一开始我改成了MINUTE,因为我不确定如何将格式改回原来的样子。再次感谢你。 - slickset

1
如果您拥有MySQL数据库,则SQL将为:
SELECT TIMESTAMPDIFF(HOUR,in,out) from checkinout;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接