2012-10-30 111 views
6

users表我有一个名为dob场存储在这种格式的用户的出生日期:谁是某一年龄SELECT *用户

1959-04-02 

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

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

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

+0

你的领域是一个日期字段权?不是一个字符串? –

+0

@FrankThomas是它的日期。 – TK123

+1

是这样做的:SELECT * FROM'users' WHERE dob> ='1993-10-30'AND dob <='1994-10-30' – kidz

回答

4

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

4

我建议是这样的:

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

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

这是一个更清洁一点,因为你不需要每次修改PHP中的两个生日(或上帝禁止,手动)。

+0

我喜欢这样的想法,即不需要计算出PHP中的日期,这正是我所做的。但是这个查询导致这个错误:'#1064 - 你的SQL语法有错误;检查与你的MySQL服务器版本相对应的手册,在'YEARS AND CURDATE() - INTERVAL 20 YEARS LIMIT 0,30'第4行'附近使用正确的语法。 – TK123

+0

它可能需要'YEAR'(单数)而不是'YEARS'(复数)。此外,鉴于这是一个日期字段而不是时间戳字段(这是我通常使用的),我不确定是否需要引号。我不这么认为,但我会测试。 –

+0

'YEAR'摆脱了语法错误,但返回了0行,即使我在表中有18岁和19岁。 – TK123

2

我没有足够的信誉发表评论,但如果你把更多的时间间隔第一大卫·格雷尼尔的回答就可以了(和今年不来,随着指出)

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