PHP:过滤:计算生日年龄,BETWEEN xx和xx

时间:2010-10-03 17:00:22

标签: php

经过一些研究而且自己承受不起,我得到了这个:

     $query .= "SELECT * FROM users WHERE birthday < SUBDATE(NOW(), INTERVAL BETWEEN $min AND $max YEAR)";

虽然这不起作用。

用户生日存储在:1991-01-01的生日列中。我的表单中有两个字段,您可以输入数字。例如,18和22。

然后它会显示年龄介于18到22岁之间的所有用户(18,19,20,21,22)。

^这就是我试图用查询过滤掉的东西。但是我做错了什么,也许你不能在INTERVAL中做BETWEEN,或者出了什么问题?

我得到了:

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 'BETWEEN 17 AND 21 YEAR)' at line 1

3 个答案:

答案 0 :(得分:2)

  

但是我做错了什么,也许你不能在INTERVAL中做BETWEEN,或者出了什么问题?

确切地说 - BETWEEN是一个布尔运算符,这意味着它返回一个布尔值(true或false),而INTERVAL想要一个整数。

WHERE birthday
  BETWEEN SUBDATE(NOW(), INTERVAL $max YEAR)
      AND SUBDATE(NOW(), INTERVAL $min YEAR)

并发出警告 - 您最好将这些变量正确转义(使用mysql_escape_string)。 Bobby Tables

另请注意:使用NOW()意味着您将包括17岁23小时前出生的人,但不包括18岁和1小时前出生的人。这通常不是我们所说的“生日” - 你最好使用TODAY()而不是NOW()

但是,对于TODAY(),还有另一个问题:BETWEEN包含在内;因此,在18到20之间,你没有2年,而是2年和1天。通过拆分BETWEEN并进行正常比较(birthday > ... AND birthday <= ...

来克服此问题

答案 1 :(得分:0)

SQL行BETWEEN只接受两个参数。您会说BETWEEN $min AND $max,而不是BETWEEN $min AND $max YEAR

如果您将日期存储为MySQL DATE而不是INT或String,那么MySQL函数可以使用MONTH(date)YEAR(date)等来解释部分日期。

尝试阅读this MySQL reference并查看它是否对您有帮助。

答案 2 :(得分:0)

如果它是一个选项,我会说削减混乱并修改mysql列或创建一个将出生日期保存为整数的列。例如,1991-12-01,你现在拥有它将是19911201.这样你可以使用类似的东西:

SELECT * FROM users WHERE birthday >= min AND birthday <= max

顺便说一下:如果可能的话,避免在select查询中使用*。