【问题标题】:SELECT * users who are a certain ageSELECT * 一定年龄的用户
【发布时间】:2012-10-20 06:51:43
【问题描述】:

users 表中,我有一个名为dob 的字段,它以这种格式存储用户的出生日期:

1959-04-02

无论如何,我想选择所有 18 岁和 19 岁的用户。这是我的查询:

SELECT *
FROM `users`
WHERE dob BETWEEN '1993-10-30' AND '1994-10-30'

但它似乎只选择了大部分 18 岁的孩子和一些(但不是全部)19 岁的孩子。我在数据库中有一堆测试用户,18 岁和 19 岁的人数相等。然而,这个查询产生了大约 90% 的 18 岁和大约 10% 的 19 岁。为什么?

【问题讨论】:

  • 您的字段是日期字段对吗?不是字符串?
  • 这样做:SELECT * FROM users WHERE dob >= '1993-10-30' AND dob
  • @kidz 同样,我认为问题是由于 Norla 提到的问题。

标签: mysql sql


【解决方案1】:

18 至 19 岁的人包含 2 岁以上的一系列生日。您的查询仅涵盖 1 年。考虑修改你的逻辑。

【讨论】:

    【解决方案2】:

    我的建议是:

    SELECT *
    FROM `users`
    WHERE dob BETWEEN 
        CURDATE() - INTERVAL 18 YEAR 
        AND CURDATE() - INTERVAL 20 YEAR 
    

    从技术上讲,这将包括今天年满 20 岁的人。您可以将interval 更改为DATE_ADD,如果您愿意,可以更精确。

    这更简洁一些,因为您不需要每次都在 PHP 中重做两个生日(或者上帝保佑,手动)。

    【讨论】:

    • 我喜欢不必在 PHP 中计算日期的想法,这正是我正在做的事情。但是这个查询会导致这个错误:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'YEARS AND CURDATE() - INTERVAL 20 YEARS LIMIT 0, 30' at line 4
    • 它可能需要是YEAR(单数)而不是YEARS(复数)。此外,鉴于这是一个日期字段而不是时间戳字段(这是我通常使用的),我不确定您是否需要引号。我不这么认为,但我会测试。
    • YEAR 摆脱了语法错误,但返回了 0 行,即使我的表中有 18 岁和 19 岁的孩子。
    • @TK123 我知道这真的很老了,但我想对发现这个的任何人(比如我自己)发表评论。首先,你必须有更大的日期。所以CURDATE() - INTERVAL 20 YEAR AND CURDATE() - INTERVAL 18 YEAR
    【解决方案3】:

    我没有足够的声誉来发表评论,但如果你把更大的时间间隔放在首位(正如所指出的那样,年份不是年份),大卫格雷尼尔的回答会起作用

    SELECT *
    FROM `users`
    WHERE dob BETWEEN 
    CURDATE() - INTERVAL 20 YEAR 
    AND CURDATE() - INTERVAL 18 YEAR 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多