#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 лет.