问题描述
我得到了一个数据库,其中 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 列被加密,我将如何实现它?
解决方法
回答你的两个问题:
- 从当前日期减去 DoB,转换为年份并向下取整
- 将根据用户的观点(即根据他们查看的日期)而变化的数据值保存在数据库中是一种非常糟糕的做法。您应该在用户查询数据时动态计算此值
更新以下评论
-
不要加密表中的 DoB。如果您不希望人们看到 DoB,请从表中删除用户访问权限
-
在排除或屏蔽 DoB 列的表上创建一个视图。将计算列添加到显示您想要的年龄相关信息的视图中