我需要存储用户DOB。我在前端创建了一个表单,通过3个选择下拉列表来接收他们的DOB year
,month
和day
。我目前正在SQL中使用相同名称的列存储这三个值。
我需要执行的一个查询是让所有用户高于或低于特定年龄。我是SQL的新手,无法用我当前存储数据的方式来想办法。起初我以为我只是将名称存储在同一列中,但很快意识到在一整年后每一行都不正确。
所以我的问题是我应该如何存储这些数据来执行可以查找特定年龄范围内用户的查询?谢谢!
答案 0 :(得分:1)
如果可能,我建议将出生日期存储为DATE类型。
CREATE TABLE users (
name VARCHAR(128),
dob DATE );
然后查询非常简单:
SELECT name, dob FROM users WHERE dob <= CURDATE() - INTERVAL 18 YEARS;
(选择所有年龄超过18岁的用户)
如果你真的想用年份,月份,日期分开存储,并希望这个查询能够执行,你可以这样做:
SELECT name, STR_TO_DATE(CONCAT_WS(',',year,month,day),"%Y-%m-%d")
FROM users
WHERE year<=YEAR(CURDATE())-18
AND month<=MONTH(CURDATE()) AND day<=DAY(CURDATE());
如果您有以下索引:
ALTER TABLE users
ADD index dob_idx(year, month, date);
(否则当行数很多时,它将无法快速运行。)
答案 1 :(得分:0)
将DOB
存储在数据类型date
的单个列中时,您可以像这样查询
select * from your_table
where DOB <= curdate() - interval 18 year
and DOB >= curdate() - interval 35 year
让用户年龄介于18至35岁之间。
DOB
应该是date
- 所以YYYY-MM-DD
例如1980-12-31