Mysql,选择年龄范围内的用户

时间:2011-04-23 10:28:57

标签: mysql

基本的查询问题,但似乎无法做到这一点。我正在努力寻找11或12岁的用户。 DOB存储为时间戳

<11>“11年前”的时间戳是956485529

<12>“12年前”的时间戳是924863129

查询:

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

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

4 个答案:

答案 0 :(得分:2)

我知道您可以更改 dob 类型。
好的,所以如果你把它改成DATETIME(并修改那一列中的值来存储出生日期作为DATETIME)你可以试试这个:

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

答案 1 :(得分:0)

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
希望这有帮助!

答案 2 :(得分:-1)

你必须像你说的那样使用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;

并使用此功能(当然,调整您的查询)

答案 3 :(得分:-1)

我会使用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