如何计算日期之间的差异;限制和排序结果?

时间:2015-10-23 16:31:08

标签: php mysql

我有一个网页,其中列出了俱乐部足球运动员的详细信息,他们的出生日期以及他们首次亮相俱乐部的日期,以及他们首次亮相的年龄。 / p>

您可以看到显示的结果here

我期待做的事情,但到目前为止没有成功,最终会在首次亮相时对这些信息进行排序,然后将其限制在三个最年轻的首次亮相中。

我的主要问题是不知道哪里开始尝试这个。

数据来自多个表,因此MySQL查询已经设置:

$result = mysql_query("SELECT dateofbirth, firstname, lastname, id FROM playerengine WHERE dateofbirth!='0000-00-00'") or die(mysql_error());
$totalRows = mysql_num_rows($result);

if ($totalRows == 0)
{
        echo "";
}
else
{
        $todaysDate = date("Y-m-d");

        while ($row = mysql_fetch_array( $result ))
        {
                $playerId = $row['3'];
                echo "<tr>";
                echo "<td width='20%'>";
                echo "".$row['1']."";
                echo "</td>";
                echo "<td width='20%'>";
                echo "".$row['2']."";
                echo "</td>";
                echo "<td width='20%'>";
                echo "".$row['0']."";
                echo "</td>";
                $debutDate = mysql_query("SELECT re.date,re.venue,re.comp,re.opponent,re.score,re.ID,ce.ID,ce.name,re.season, mt.ID as matchId FROM resultengine re INNER JOIN matchteam mt ON mt.ID=re.ID INNER JOIN clubengine ce ON re.opponent=ce.ID WHERE (mt.ID1 = '".$playerId."' or mt.ID2 = '".$playerId."' or mt.ID3 = '".$playerId."' or mt.ID4 = '".$playerId."' or mt.ID5 = '".$playerId."' or mt.ID6 = '".$playerId."' or mt.ID7 = '".$playerId."' or mt.ID8 = '".$playerId."' or mt.ID9 = '".$playerId."' or mt.ID10 = '".$playerId."' or mt.ID11 = '".$playerId."' or (ID12='".$playerId."' AND SI12 != 0) or (ID13='".$playerId."' AND SI13 != 0) or (ID14='".$playerId."' AND SI14 != 0) or (ID15='".$playerId."' AND SI15 != 0) or (ID16='".$playerId."' AND SI16 != 0) or (ID17='".$playerId."' AND SI17 != 0) or (ID18='".$playerId."' AND SI18 != 0) AND (mt.ID!='1624') AND (mt.ID!='1638') AND (mt.ID!='225') AND (mt.ID!='248')) GROUP BY re.season ORDER BY re.season ASC LIMIT 1") or die(mysql_error());
                $totalRows = mysql_num_rows($debutDate);
                while ($debutRow = mysql_fetch_array($debutDate))
                {
                    echo "<td width='20%'>";
                    echo "Debut Date: ".$debutRow['0']."<br />vs.".$debutRow['7'];
                    echo "</td>";
                    echo "<td width='20%'>";
                    $date1 = new DateTime($row['0']);
                    $date2 = new DateTime($debutRow['0']);
                    $interval = $date1->diff($date2);
                    $years = $interval->format('%Y');
                    $days = $interval->format('%a') - (int)$years*365;
                    echo "aged ".$years ." years and ". $days." days";
                    echo "</td>";
                }
                echo "</tr>";
        }
}

我知道mysql_ *函数已经在PHP中被折旧,并且会在所有内容最终确定/放置之前将其更改为mysqli_ * - 但是就这个时代而言任何指针都会非常棒。

1 个答案:

答案 0 :(得分:1)

请查看MySQL date functions。在您的情况下,datediff可能是您需要的功能。 例如。这将使你在他们首次亮相的日子里得到它们的年龄

SELECT dateofbirth, firstname, lastname, id, DATEDIFF(dateofdebut, dateofbirth) AS daysOldOnDebut FROM playerengine WHERE dateofbirth!='0000-00-00' ORDER BY daysOldOnDebut

,而

SELECT dateofbirth, firstname, lastname, id, DATEDIFF(dateofdebut, dateofbirth) AS daysOldOnDebut FROM playerengine WHERE dateofbirth!='0000-00-00' ORDER BY dateofdebut

会在首次亮相的(绝对)日订购时,为您提供他们首次亮相时的年龄。

您可以通过指定ALIAS(select ... AS yourAlias)来使用PHP中的mysql函数的结果,并使用此别名,就像它是普通列一样。

编辑:当然,您始终可以为这两个查询添加LIMIT 42

还请考虑添加一个包含高层表达式结果的列,并使用trigger进行更新。这对于性能很重要,因为普通查询需要为每一行计算表达式,并且每次执行查询时都要计算,但它们通常不应经常更改。