You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据登录用户出生日期查询users表中指定年龄范围的用户?

实现方案

我们默认需求为查找年龄比当前登录用户小2岁~比当前登录用户大3岁的用户,对应的出生日期范围为「登录用户出生日期往前推3年 ~ 登录用户出生日期往后推2年」,如果需求刚好相反,直接调整时间计算的参数即可。


方案1:PHP预计算时间边界(推荐)

该方案可以命中dob字段的索引,查询性能更高:

// 1. 先查询获取当前登录用户的出生日期
$currentUser = $db->query(
    'SELECT dob FROM users WHERE id = :id',
    [':id' => $userid]
)->fetch();
$loginUserDob = $currentUser['dob'];

// 2. 计算出生日期的合法范围
// 大3岁的用户出生更早,最小日期为登录用户出生日期减3年
$minDob = date('Y-m-d', strtotime($loginUserDob . ' -3 years'));
// 小2岁的用户出生更晚,最大日期为登录用户出生日期加2年
$maxDob = date('Y-m-d', strtotime($loginUserDob . ' +2 years'));

// 3. 拉取符合条件的所有用户
$users = $db->query(
    'SELECT id, name, gender, dob FROM users 
     WHERE dob BETWEEN :min_dob AND :max_dob
     AND id != :login_user_id', // 不需要排除当前登录用户的话删掉这行即可
    [
        ':min_dob' => $minDob,
        ':max_dob' => $maxDob,
        ':login_user_id' => $userid
    ]
)->fetchAll();

方案2:纯SQL实现

不需要额外PHP逻辑,直接在数据库层完成计算:

$users = $db->query(
    'SELECT u.id, u.name, u.gender, u.dob 
     FROM users u
     JOIN (SELECT dob FROM users WHERE id = :login_user_id) curr
     WHERE u.dob BETWEEN DATE_SUB(curr.dob, INTERVAL 3 YEAR) 
                      AND DATE_ADD(curr.dob, INTERVAL 2 YEAR)
     AND u.id != :login_user_id',
    [':login_user_id' => $userid]
)->fetchAll();

注意事项

  • 两种方案均精确到天匹配,完全适配dob字段YYYY-MM-DD的存储格式
  • 如果实际需求的年龄范围和上述相反,只需要把时间计算的-3 years和+2 years调换即可

内容的提问来源于stack exchange,提问作者Max Njoroge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:21:01