2015-10-19 2 views
0

У меня есть таблица с датой рождения пользователей моей платформы, и мне нужно отсортировать их по возрастным диапазонам (18-25, 25-35 и т. Д.) Для проекта stat back-office. Они уже сортируются по полу.SQL. Статистика пользователей по возрастному диапазону

Вот мой код:

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); 
+1

Он работает. Большое спасибо. Я буду винить себя навсегда за такую ​​очевидную ошибку! Угадай, что я буду замедляться на кафе. – Mateus

+0

@Mateus Ну, хорошо, что это было просто небольшое изменение. Пожалуйста, не забудьте «награды». –

+0

@mateus или, возможно, увеличить кофеин :) – logixologist

Смежные вопросы