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


How to calculate difference between dates; limit and sort results?

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

您可以看到这里显示的结果。

我想要做的是,最终按照出道年龄对这些信息进行分类,然后将它们限制在,例如,三位最年轻的出道演员,但目前还没有成功。

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

数据来自多个表,因此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_* -但任何指针到目前为止,这个年龄的事情将是了不起的。

请看MySQL的日期函数。在您的情况下,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

还请考虑添加一个列来保存上面表达式的结果,并使用触发器进行更新。这对性能很重要,因为常规查询要求为每一行计算表达式,并且每次执行查询时都要计算表达式,但是它们通常不应该经常更改。