Mysql 如何使用sql从数据库中的日期列派生年龄?
我正在尝试使用Mysql 如何使用sql从数据库中的日期列派生年龄?,mysql,Mysql,我正在尝试使用mysqli显示特定年龄段(如10到20岁)的所有用户。什么样的查询最适合得出年龄以及如何得出年龄 我目前遇到一个查询问题,该查询没有显示准确的结果。我想显示的是年龄介于这个和那个之间的用户,但是下面的查询没有给出任何错误,而是显示年龄在10岁以下或20岁以上的用户。我有两张用户和用户喜欢的表格 user username(pk) gender date_of_birth country John
mysqli
显示特定年龄段(如10到20岁)的所有用户。什么样的查询最适合得出年龄以及如何得出年龄
我目前遇到一个查询问题,该查询没有显示准确的结果。我想显示的是年龄介于这个和那个之间的用户,但是下面的查询没有给出任何错误,而是显示年龄在10岁以下或20岁以上的用户。我有两张用户和用户喜欢的表格
user
username(pk) gender date_of_birth country
John M 2010-12-31 India
Bing M 2000-12-31 Italy
Rose F 2000-12-01 UK
user_likes
username(fk) gender age_from to_age
John F 18 30
Bing F 20 30
Rose M 18 25
下面的$username
是存储在该变量中的会话
$sql = "SELECT gender, age_from, to_age FROM user_likes WHERE username = '$username'";
$result = $conn->query($sql);
if ($result->num_rows > 0)
{
while ($row = $result->fetch_assoc())
{
$gender1 = $row['gender'];
$age_from = $row['age_from'];
$to_age = $row['to_age'];
}
}
$sql1 = "SELECT username, date_of_birth, TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS age FROM user WHERE NOT username = '$username' AND gender = '$gender1' AND (date_of_birth BETWEEN '$age_from' AND '$to_age')";
$result = $conn->query($sql1);
if ($result->num_rows > 0)
{
while ($row = $result->fetch_assoc())
{
echo "<div>";
echo "<span><a href = 'accounts.php?usernames=".$username."'><img src = '".$row['photo']."' alt = 'profile photo'></span>";
echo "<div>".$row['username']."</a><br><span>From".$row['country']."</span></div>";
echo "</div>";
}
}
或
我期望的是——假设我是Rose,由于我的兴趣性别是男性,选择的年龄范围是18到25岁,我只希望显示'Bing'
用户
date_of_birth BETWEEN '$age_from' AND '$to_age'
让我们用一些值替换这些字段
'2010-12-31' BETWEEN '18' AND '20'
这是无意义的,你可能更愿意使用
...
AND TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '$age_from' AND '$to_age'
例如:
架构(MySQL v5.7)
查询#1
SELECT username,
date_of_birth,
TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS "age"
FROM users
WHERE (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '18' AND '20');
输出
| username | date_of_birth | age |
| -------- | ------------- | --- |
| Bing | 2000-12-31 | 18 |
| Rose | 2000-12-01 | 18 |
| username | date_of_birth | age |
| -------- | ------------- | --- |
| John | 2010-12-31 | 8 |
查询#2
SELECT username,
date_of_birth,
TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS "age"
FROM users
WHERE (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '01' AND '10');
输出
| username | date_of_birth | age |
| -------- | ------------- | --- |
| Bing | 2000-12-31 | 18 |
| Rose | 2000-12-01 | 18 |
| username | date_of_birth | age |
| -------- | ------------- | --- |
| John | 2010-12-31 | 8 |
在我看来,您的查询有一个缺陷。在
...WHERE ... AND (date_of_birth BETWEEN '$age_from' AND '$to_age')
…您正在将出生日期(日期)与年龄(整数)进行比较。这毫无意义,你可能会得到任何意想不到的结果
尝试修改WHERE子句,以便:
...WHERE ... AND (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '$age_from' AND '$to_age')
最后一句:
$sql1 = "SELECT username, date_of_birth, TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS age FROM user WHERE NOT username = '$username' AND gender = '$gender1' AND (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '$age_from' AND '$to_age')";
用年龄替换出生日期会让情况变得更糟,因为它根本不显示任何内容,而出生日期显示所有用户,而不是只显示想要的年龄范围。真的,我确实犯了一点错误。谢谢它的工作原理,但你会推荐我这样做吗?还是更喜欢其他方法?你没有那么多选择。这条路就是我要用的。但是我强烈建议您使用参数化查询来避免SQL注入谢谢。。。。但我必须问——为什么我的查询有缺陷?您是否更喜欢其他方法?请编辑您的评论答案。
$sql1 = "SELECT username, date_of_birth, TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS age FROM user WHERE NOT username = '$username' AND gender = '$gender1' AND (TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN '$age_from' AND '$to_age')";