1

在此之前,我已被告知 SO的正确方法是:

WHERE birth_date BETWEEN date_sub(curdate(), INTERVAL 25 YEAR) 
                     AND date_sub(curdate(), INTERVAL 30 YEAR)

但是,这实际上并不包括 30 岁以上和 31 岁以下的用户。当我们通常所说的人的年龄时,我们将 30 岁 11 个月的人仍然是“30”。

考虑到这一点,简单地设置第二个间隔31(比您预期的多一年)似乎是一个明显的解决方案,但这包括今天年满 31 岁的用户,所以这不好。

那么,在 MySQL中将生日存储为 type 时,找到年龄大于或等于25 岁且小于31 岁的用户的明确最快的方法是什么?date

4

2 回答 2

3

您只需要切换两个日期,在第一个日期添加另一天,如下所示:

WHERE birth_date 
BETWEEN 
    date_add(
        date_sub(curdate(), INTERVAL 31 YEAR), 
        INTERVAL 1 DAY
    )
AND date_sub(curdate(), INTERVAL 25 YEAR) 

查看其他建议的答案,实际上有一个更简单的解决方案。

WHERE birth_date <= date_sub(curdate(), INTERVAL 25 YEAR) 
      AND birth_date > date_sub(curdate(), INTERVAL 31 YEAR)

请注意>第二次比较,这节省了添加 1 天间隔,但您仍然需要使用 31 年,而不是 30 年。BETWEEN AND表达式将执行>=and <=

(当它被证明是正确的并且他/你编辑了比较并将 30 更改为 31 时,请接受他的答案 - 他指出我正确的方向)

于 2013-03-10T01:32:39.387 回答
1

当进行正常比较时,您不必使用BETWEEN日期,尤其是在具有奇怪边缘行为的情况下。

WHERE birth_date <= date_sub(curdate(), INTERVAL 25 YEAR) 
      AND birth_date >= date_sub(curdate(), INTERVAL 30 YEAR)
于 2013-03-10T01:34:55.807 回答