1

好的,伙计们,这可能有一个简单的答案,但现在已经困扰了我几个小时。

我正在使用 PHP/HTML 从 MySQL 表生成一个表。在 MySQL 表 (TimeRecords) 中,我有一个 StartTime 和 EndTime 列。在我的 SELECT 语句中,我从 StartTime 中减去 EndTime 并将其别名为 TotalHours。到目前为止,这是我的查询:

$query = "SELECT *,((EndTime - StartTime)/3600) AS TotalPeriodHours
    FROM TimeRecords
    WHERE Date
    BETWEEN '{$CurrentYear}-{$CurrentMonth}-1'
    AND '{$CurrentYear}-{$CurrentMonth}-31'
    ORDER BY Date
    ";

然后我通过一个 HTML 表循环它。到目前为止,一切都很好。我想做的是将所有的 TotalHours 相加并将其放入一个单独的 DIV 中。关于 1)如何编写 select 语句和 2)在哪里从 PHP/HTML 调用该代码的任何想法?

提前致谢!

4

3 回答 3

3

尝试这个

$query= "
    SELECT ((EndTime - StartTime)/3600) AS Hours, otherFields, ...
    FROM TimeRecords
    WHERE 
        Date BETWEEN '{$CurrentYear} - {$CurrentMonth} - 1'
        AND '{$CurrentYear}-{$CurrentMonth} - 31' ";

$records =mysql_query($query);
$sum= 0;
while($row=mysql_fetch_array($records))
{
      echo"$row['otherFields']";
      echo"$row['Hours']";
     $sum+=$row['Hours'];
 } 

 echo" Total Hours : $sum ";
于 2012-04-17T04:22:31.267 回答
0

如果您使用GROUP BY WITH ROLLUP具有唯一 id,则可以在同一查询中执行此操作

$query = "
    SELECT unique_id,SUM((EndTime - StartTime)/3600) AS TotalPeriodHours
    FROM TimeRecords
    WHERE Date BETWEEN '{$CurrentYear}-{$CurrentMonth}-1'
      AND '{$CurrentYear}-{$CurrentMonth}-31'
    GROUP BY unique_id WITH ROLLUP
    ORDER BY Date
";

在这种情况下,您查询的最后一个结果包含 NULL 和总总数。如果您没有唯一的 ID,则需要按照 Naveen 的回答在 PHP 中执行此操作。

对您的代码的一些评论:

  • 使用 SELECT * 不被认为是好的做法。选择您需要的列。
  • 并非所有月份都有 31 天,因此这可能会产生意想不到的结果。如果您使用的是 PHP5.3+,则可以使用

    $date = new DateTime(); $endDate = $date->format('Ymt');

此处的“t”标志获取该月的最后一天。有关 DateTime 的更多信息,请参阅PHP 文档

于 2012-04-17T06:10:21.813 回答
0

只需将单个查询与Sum()一起使用。如果您已经显示所有行,您也可以手动计算它。(如果分页或使用 LIMIT,您将需要一个单独的查询,如下所示。)

$query = "
    SELECT Sum(((EndTime - StartTime)/3600)) AS SumTotalPeriodHours
    FROM TimeRecords
    WHERE 
        Date BETWEEN '{$CurrentYear} - {$CurrentMonth} - 1'
        AND '{$CurrentYear}-{$CurrentMonth} - 31'
";
于 2012-04-17T04:15:13.637 回答