如果 DOB 列被加密,我将如何计算 MySQL 中每个人的年龄

问题描述

我得到了一个数据库,其中 dob 列使用加密进行加密。假设该列必须保持加密,我将如何获取/更新每个用户的年龄?

目前,我使用以下代码计算年龄: (userBirthday 以 YYMMDD 格式给出,我在加密 dob 之前计算了年龄)

function get_age(time) {
    var year = time.slice(0,4);
    var month = time.slice(4,6);
    var day = time.slice(6);
    //month is 0-indexed
    var years_elapsed = (new Date(new Date().getTime() - (new Date().getTimezoneOffset() * 60000)) - new Date(year,month - 1,day))/(MILLISECONDS_IN_A_YEAR);
    return Math.floor(years_elapsed); 
}

let birthdayFull = req.body.userBirthday;
let birthYr = birthdayFull.slice(0,2);
let currentYear = new Date().getFullYear().toString().slice(2);

if(birthYr < currentYear) {
    birthdayFull = '20' + birthdayFull;
} else {
    birthdayFull = '19' + birthdayFull;
}
let age = get_age(birthdayFull);

根据年份,我会添加“19”或“20”以将日期转换为 YYYYMMDD 格式。但是,如果我运行 get_age 函数,我会得到一个不准确的答案。例如,如果 dob 是 '19920215',则返回值为 29,即使用户仍然是 28。

我的问题是 1. 我如何准确计算用户年龄(获取实际年龄,也就是仅在实际生日已过时才添加一年)和 2. 如果我想每天午夜检查年龄更新(以检查某人的年龄是否改变),如果 dob 列被加密,我将如何实现它?

解决方法

回答你的两个问题:

  1. 从当前日期减去 DoB,转换为年份并向下取整
  2. 将根据用户的观点(即根据他们查看的日期)而变化的数据值保存在数据库中是一种非常糟糕的做法。您应该在用户查询数据时动态计算此值

更新以下评论

  1. 不要加密表中的 DoB。如果您不希望人们看到 DoB,请从表中删除用户访问权限

  2. 在排除或屏蔽 DoB 列的表上创建一个视图。将计算列添加到显示您想要的年龄相关信息的视图中