有没有一种方法可以只使用年龄来获取(默认)日期?

时间:2019-02-11 21:03:44

标签: mysql sql node.js promise

当前在NodeJS约会网站的后端,我正在研究过滤器,尤其是年龄过滤器,方法是获取最小和最大年龄。

在我的数据库中,出生日期的格式为:YYYY-MM-DD。如果我将最小年龄(称为[B])设置为20,将最大年龄(称为[A])设置为26,则应该能够使所有人的年龄都处于[26; 20]范围内。 我认为有可能像这样:

  • 取[B]。 (在此示例中为20。)
  • 然后取当前年份并减去[B]。 (2019-[B] = 1999)
  • 最后将默认日期(例如1月1日)与获得的年份一起放入。 (=> 1999-01-01) 我们将对[A]执行相同的操作,最后将日期范围设置为[1993-01-01; 1999-01-01]。
exports.getPeopleByAge = (data) => {
    return new Promise((resolve, reject) => {
        var ageMax = data.limitAgeMax;
        var ageMin = data.limitAgeMin;
        return mysql.createConnection({
            host:'localhost',
            user:'root',
            password:'pass',
            database:'databasename'
        })
        .then((conn) => {
            return conn.query("SELECT * FROM users WHERE YEAR(age) BETWEEN ? AND ? ORDER BY YEAR(age) ASC", [data.limitAgeMax, data.limitAgeMin]);
            resolve(); 
        })
    }).catch((error) => {
        reject(error);
    })
}

对于那些想知道我在数据中收到的信息的人:

{
    sortby: 'age',
    limitAgeMin: '18',
    limitAgeMax: '19',
    range: '20',
    tags: [ '"vegan"', '"music"' ],
    order: 'asc' 
}

之所以没有完成,是因为我没有找到解决问题的答案。 我愿意接受所有建议。感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:0)

您可以使用MySQL function TIMESTAMPDIFF从用户的出生日期开始计算其年龄,例如:

SELECT u.* 
FROM users 
WHERE TIMESTAMPDIFF(YEAR, u.birthdate, NOW()) BETWEEN :ageMin AND :ageMax

更好的是,您可以使用DATE_SUB动态选择要选择的出生日期范围,以选择可读性较低但效率更高的方法:

SELECT u.* 
FROM users 
WHERE u.birthdate BETWEEN 
    DATE_SUB(NOW(), INTERVAL :ageMax YEAR)
    AND DATE_SUB(NOW(), INTERVAL :ageMin YEAR)