【问题标题】:Date Of Birth + Birthday SQL出生日期 + 生日 SQL
【发布时间】:2014-08-03 08:52:55
【问题描述】:

我需要存储用户出生日期。我在前端创建了一个表单,通过 3 个选择下拉菜单获取他们的出生日期 yearmonthday。我目前将这三个值存储在 SQL 中,列同名。

我需要执行的查询之一是让所有用户高于或低于特定年龄。我是 SQL 新手,想不出用我当前存储数据的方式来做这件事的正确方法。起初我以为我只是将名称存储在同一列中,但很快意识到整整一年后每一行都是不正确的。

所以我的问题是我应该如何存储这些数据来执行可以找到特定年龄范围内的用户的查询?谢谢!

【问题讨论】:

  • 年/月/日列的当前数据类型有哪些?整数?字符串?前导零还是没有?

标签: mysql sql


【解决方案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);

(不然行多的时候跑不快)。

【讨论】:

    【解决方案2】:

    当您将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

    【讨论】:

    • 进入数据库时​​ DOB 应该是什么样子?
    • 我怎样才能在 x 岁和 y 岁之间穿梭?
    猜你喜欢
    • 2021-11-05
    • 2011-04-14
    • 2013-05-10
    • 2019-03-09
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多