Подсчитать количество людей, использующих свой идентификационный номер в определенном возрастном диапазоне

#mysql #sql

#mysql #sql

Вопрос:

У меня есть таблица с двумя столбцами. Первый столбец — персональный идентификационный номер, второй столбец — имя. Мне нужно подсчитать, сколько детей в возрасте от 5 до 16 лет (старше 5 и младше 16), используя их идентификационный номер (который содержит дату рождения).

Пример:

 ID                  Name
_________________________
0906013123588   |   Name1
1508007128536   |   Name2
1603008120746   |   Name3
2705983123601   |   Name4
0101018125432   |   Name5
  

Результат должен быть: 3

Первые 7 цифр идентификационного номера представляют дату рождения, следующие 6 цифр — контрольный номер (который меня на данный момент не интересует).

Комментарии:

1. Прежде всего, вы должны расширить свою таблицу столбцом для даты рождения людей.

2. Каков формат даты в идентификаторе?

3. @cdaiga день, месяц, год

4. @cdaiga ДД/ ММ/ГГГГ

5. @DCO 7 цифр, так что это 06.09.2013 => 06.09.2013

Ответ №1:

Решение состоит в том, чтобы очистить дизайн вашей базы данных. Вы могли бы создать новую таблицу и преобразовать свои данные в эту новую таблицу программно. Ваша новая таблица должна содержать отдельный столбец даты для date_of_birth.

Я думаю, что MySQL не способен обрабатывать формат гггг. Он может обрабатывать только yy или гггг. https://www.w3schools.com/sql/func_mysql_date_format.asp

если формат будет правильным, вы могли бы сделать что-то вроде:

 SELECT * 
FROM person_table 
WHERE
DATEDIFF(
  CURRENT_DATE,
  STR_TO_DATE(
    SUBSTRING(
      CONVERT (ID,char)
      ,0,6
    ),'%d%m%y'
  )/365
BETWEEN 5 AND 16
  

Комментарии:

1. Спасибо, я попробую это и дам вам знать, как все прошло.

Ответ №2:

Я бы не использовал datediff() для этой цели. Я бы просто сравнил дату рождения с соответствующим диапазоном дат рождения:

 SELECT pt.* 
FROM person_table pt
WHERE STR_TO_DATE(LEFT(ID, 6), '%d%m%y') > curdate() - interval 16 year AND
      STR_TO_DATE(LEFT(ID, 6), '%d%m%y') <= curdate() - interval 5 year;
  

Вам нужно быть осторожным с двузначными годами. В конце концов, идентификатор не очень хорошо обрабатывает людей старше 100 лет.