MySQL 查询:有没有更好的方法来根据birth_date 日期字段获取 X 岁或以上的用户
Posted
技术标签:
【中文标题】MySQL 查询:有没有更好的方法来根据birth_date 日期字段获取 X 岁或以上的用户【英文标题】:MySQL Query: Is there a better way to get users who are X years old or older based on birth_date date field 【发布时间】:2015-12-11 18:55:53 【问题描述】:我目前将用户的出生日期存储为 DATE
字段,0000-00-00
作为默认值。
例如,我正在使用此查询来获取 30 岁或以上的用户。
SELECT *
FROM myUsers
WHERE birth_date != '0000-00-00'
AND DATE(birth_date) < DATE( DATE_SUB( NOW() , INTERVAL 30 YEAR ) )
ORDER BY user_id desc LIMIT 0,10
这是获得我想要的正确的 sql 查询吗? (获取 30 岁以上或正好 30 岁的用户)是否可以对其进行改进/优化?
【问题讨论】:
DATE() 禁止使用索引,因此提供范围会更有效 我会为此使用<=
- 正如所写,今天是 30 岁生日的人将被排除在外。
@Siyual 这是要执行的另一项操作。这取决于 op 想要什么。
@inetphantom ...获取 30 岁或以上的用户... -- OP 想要什么的要求非常清楚。将<
运算符更改为<=
不会影响查询...
@Siyual 获取30岁以上的用户和X岁以上的也很清楚,这就是我提到它的原因
【参考方案1】:
这并不总是错误的,但我不喜欢将日期存储为0000-00-00
作为默认值,而是使用 NULL(除非它有特殊含义,并且您必须将其与 NULL 区分开来)。
然后您使用DATE()
函数从日期时间字段中删除时间信息,但由于birth_date
不是日期时间字段,因此没有理由使用它。这可以利用索引(如果存在)。
然后你可以使用这个查询:
SELECT *
FROM myUsers
WHERE birth_date <= CURRENT_DATE()-INTERVAL 30 YEAR
ORDER BY user_id DESC
LIMIT 0,10
(如果默认值为 NULL,则无需检查)。只需决定是否要使用 <
或 <=
,但我更喜欢后者,因为它会包括生日的人。
在birth_date 和user_id 字段上建立索引是个好主意。
【讨论】:
【参考方案2】:如果您有 0000-00-00
值,请像这样使用 BETWEEN
:
SELECT *
FROM myUsers
WHERE birth_date BETWEEN '0000-01-01' and CURRENT_DATE() - INTERVAL 30 YEAR
ORDER BY user_id DESC
LIMIT 0, 10
【讨论】:
以上是关于MySQL 查询:有没有更好的方法来根据birth_date 日期字段获取 X 岁或以上的用户的主要内容,如果未能解决你的问题,请参考以下文章