【问题标题】:Need to figure out total hours between check-in and check-out times需要计算入住和退房时间之间的总小时数
【发布时间】:2016-09-05 21:15:09
【问题描述】:

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

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

到目前为止一切都很好,但是当我退房时...

目前,我的代码更新了所有匹配的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吗?如果是这样,一个人怎么能签到两次而不签出?
  • 我对 PHP 还是很陌生,所以表单没有任何验证。从技术上讲,您可以签到两次。我正在尝试找出在不影响流程中其他行的情况下插入结帐时间和总小时数的逻辑。
  • 是的,child_id 是用户的id。在表格中,您将输入名字和姓氏,然后签入或签出孩子
  • 让我编辑我的图片更准确...
  • 所以您只想在结账时更新一条记录?如果是这样,我认为问题出在:AND in IS NOT NULL。应该是out 而不是in

标签: php sql database insert


【解决方案1】:

我认为您可以在第一个更新语句中使用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 列中还没有值的行。

【讨论】:

  • 谢谢,这段代码非常适合我的目的。
  • 不客气。我注意到我在您接受答案时编辑了答案。编辑后的版本应该以您当前拥有的相同格式为您提供小数小时。
  • 太棒了!起初我将其更改为 MINUTE,因为我不确定如何使该格式恢复原状。再次感谢您。
【解决方案2】:

如果你有 MySQL Db THEN sql 将是

SELECT TIMESTAMPDIFF(HOUR,in,out) from checkinout;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多