【问题标题】:Mysql, selecting users in a age rangeMysql,选择一个年龄段的用户
【发布时间】:2011-04-23 10:28:57
【问题描述】:

基本查询问题,但似乎无法正确解决。我正在尝试查找 11 或 12 岁的用户。 DOB 存储为时间戳

“11 年前”的时间戳为 956485529

“12 年前”的时间戳为 924863129

查询:

SELECT * FROM (`users`) WHERE `dob` < 956485529 AND `dob` > 924863129

似乎只返回 11 岁的用户,而不是 12 岁的用户。我做错了什么?

【问题讨论】:

  • dob列的数据类型是什么?
  • 如果可能,使用 TIMESTAMP 数据类型

标签: mysql


【解决方案1】:

我了解到您可以更改您的 dob 类型。
好的,因此,如果您将其更改为 DATETIME(并修改该列中的值以将出生日期存储为 DATETIME),您可以尝试以下操作:

select * FROM users  
WHERE (dob>DATE_SUB(NOW(),INTERVAL 13 YEAR)) 
  AND (dob<=DATE_SUB(NOW(),INTERVAL 11 YEAR));

【讨论】:

    【解决方案2】:
    SELECT * FROM (`users`) WHERE `dob` < 956485529 AND `dob` > 924863129
    

    它只返回 11 岁的用户,因为:

    mysql> select FROM_UNIXTIME(924863129), CURRENT_TIMESTAMP();
    +--------------------------+---------------------+
    | FROM_UNIXTIME(924863129) | CURRENT_TIMESTAMP() |
    +--------------------------+---------------------+
    | 1999-04-23 18:25:29      | 2011-04-23 22:06:50 |
    +--------------------------+---------------------+
    
    mysql> select FROM_UNIXTIME(956485529), CURRENT_TIMESTAMP();
    +--------------------------+---------------------+
    | FROM_UNIXTIME(956485529) | CURRENT_TIMESTAMP() |
    +--------------------------+---------------------+
    | 2000-04-23 18:25:29      | 2011-04-23 22:07:19 |
    +--------------------------+---------------------+
    

    今天是2011-04-23! 2011-04-23 - 1999-04-23 = 12!

    所以你应该这样写你的查询:

    SELECT * FROM (`users`) WHERE `dob` < 956485529 AND `dob` >= 924863129
    

    希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      你必须像你说的那样使用OR,因为dob列不能同时有两个不同的值。

      `dob` < 956485529 AND `dob` > 924863129
      

      或者您可以尝试将时间戳转换为年份:

      SELECT
        FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year
      FROM
        table_name
      WHERE
        FROM_UNIXTIME(my_unix_timestamp_column, '%Y') = 2009;
      

      并玩这个(当然,调整你的查询)

      【讨论】:

      • 我认为这行不通:如果 'dob`
      • 此查询返回我的所有用户,包括 12 岁以上的用户。
      【解决方案4】:

      我会使用 BETWEEN 条件:

      SELECT * FROM (`users`) WHERE `dob` BETWEEN 924863129 AND 956485529
      

      另外,我推荐TIMESTAMP 数据类型。有了它,您可以执行以下操作:

      SELECT * FROM (`users`) WHERE `dob` BETWEEN DATE_SUB(NOW(), INTERVAL 12 YEAR) AND DATE_SUB(NOW(), INTERVAL 11 YEAR)
      

      更多示例在这里:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

      【讨论】:

      • 我可以更改DOB列的数据类型没有问题
      • 这样做 :) varchar 不适合日期
      • BETWEEN 查询只返回 11 岁,而不是 12 岁。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2012-10-20
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多