我有一个表格,其中包含我的平台用户的出生日期,我需要按年龄范围(18-25,25-35等)对后台统计项目进行排序。它们已按性别分类。
这是我的代码:
public function GenreByAge() {
$date_day = new datetime();
$date_day = $date_day->format('Y-m-d');
$sql = "SELECT count(*) as nb, id_thematique, dn
FROM qr_thematique_preco q
INNER JOIN users as u ON u.id_user = q.id_membre
WHERE u.id_part = '$this->id_part'
AND u.sexe = '$this->genre'";
switch ($this->tranche_age) {
case 1:
$sql .= AND DATE_FORMAT(dn,'%Y-%m-%d') <= date_sub(curdate(), INTERVAL 18 YEAR)
AND DATE_FORMAT(dn,'%Y-%m-%d') > date_sub(curdate(), INTERVAL 26 YEAR);
break;
case 2:
$sql .= AND dn <= date_sub(curdate(), INTERVAL 26 YEAR)
AND dn > date_sub(curdate(), INTERVAL 36 YEAR);
break;
case 3:
$sql .= AND dn <= date_sub(curdate(), INTERVAL 36 YEAR)
AND dn > date_sub(curdate(), INTERVAL 46 YEAR);
break;
case 4:
$sql .= AND dn <= date_sub(curdate(), INTERVAL 46 YEAR)
AND dn > date_sub(curdate(), INTERVAL 56 YEAR);
break;
case 5:
$sql .= AND dn <= date_sub(curdate(), INTERVAL 56 YEAR)
AND dn > date_sub(curdate(), INTERVAL 66 YEAR);
break;
但查询并没有用我的数据返回任何内容。
感谢您帮助我。
答案 0 :(得分:0)
您已将WHERE
条件写错了,它们是互斥的。
例如,出生日期不能同时少于18年,过去超过26年。
AND DATE_FORMAT(dn,'%Y-%m-%d') <= date_sub(curdate(), INTERVAL 18 YEAR)
AND DATE_FORMAT(dn,'%Y-%m-%d') > date_sub(curdate(), INTERVAL 26 YEAR);
(一个人不能同时年龄小于18岁且大于26岁。)
如果您想生成捕获特定日期范围的日期间隔,建议您使用BETWEEN
。
AND DATE_FORMAT(dn,'%Y-%m-%d')
BETWEEN date_sub(curdate(), INTERVAL 26 YEAR) AND
date_sub(curdate(), INTERVAL 18 YEAR);
或者,您只需将现有条件中的规则切换为:
AND DATE_FORMAT(dn,'%Y-%m-%d') >= date_sub(curdate(), INTERVAL 18 YEAR)
AND DATE_FORMAT(dn,'%Y-%m-%d') < date_sub(curdate(), INTERVAL 26 YEAR);