За последние 24 часа нас посетили 20676 программистов и 1107 роботов. Сейчас ищут 349 программистов ...

Как выбрать из таблицы только тех сотрудников кому в текущем году исполняется 40, 45, 50, 55 и 60 ?

Тема в разделе "PHP и базы данных", создана пользователем elikmhs546, 6 сен 2019.

  1. elikmhs546

    elikmhs546 Новичок

    С нами с:
    6 сен 2019
    Сообщения:
    6
    Симпатии:
    1
    Код (Text):
    1. <?php
    2. $result = mysql_query("SELECT * FROM main_table ORDER by born_date");
    3. $myrow = mysql_fetch_array ($result);
    4.  
    5. $i=0;
    6.  
    7. function dateconv($date) {
    8. $exp = explode ("-", $date);
    9. $result = $exp[2].".".$exp[1].".".$exp[0];
    10. return $result;
    11. }
    12.  
    13.  
    14. function calculate_age($birthday) {
    15. $birthday_timestamp = strtotime($birthday);
    16. $age = date('Y') - date('Y', $birthday_timestamp);
    17. if (date('Y', $birthday_timestamp) > date('Y')) {
    18. $age--;
    19. }
    20. return $age;
    21. }
    22.  
    23.  
    24. do {
    25. printf ("<tr>
    26. <td>%s</td>
    27. <td>%s</td>
    28. <td>%s</td>
    29. <td>%s</td>
    30. <td>%s</td></tr>", $myrow['name'], $myrow['new_job'], dateconv($myrow['born_date']), calculate_age($myrow['born_date']));
    31. }
    32. while ($myrow = mysql_fetch_array ($result));
    33.  
    34. ?>
    Пишу как выше выводятся все
    Буду благодарен любой помощи.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
  3. elikmhs546

    elikmhs546 Новичок

    С нами с:
    6 сен 2019
    Сообщения:
    6
    Симпатии:
    1
    PHP:
    1. <?php
    2. $result = mysql_query("SELECT * FROM main_table ORDER by born_date");
    3. $myrow = mysql_fetch_array ($result);
    4.  
    5.  
    6. function dateconv($date) {
    7. $exp = explode ("-", $date);
    8. $result = $exp[2].".".$exp[1].".".$exp[0];
    9. return $result;
    10. }
    11.  
    12. function calculate_age($birthday) {
    13. $birthday_timestamp = strtotime($birthday);
    14. $age = date('Y') - date('Y', $birthday_timestamp);
    15. if (date('Y', $birthday_timestamp) > date('Y')) {
    16. $age--;
    17. }
    18. return $age;
    19. }
    20.  
    21. do {
    22. printf ("<tr>
    23. <td>%s</td>
    24. <td>%s</td>
    25. <td>%s</td>
    26. <td>%s</td>
    27. <td>%s</td></tr>", $myrow['name'], $myrow['new_job'], dateconv($myrow['born_date']), calculate_age($myrow['born_date']));
    28. }
    29. while ($myrow = mysql_fetch_array ($result));
    30.  
    31. ?>
    Пишу как выше выводятся
    Олег-28
    Сергей-39
    Эльдар-50
    Алла-58
    Керил-55
    Анна-60
    Тимур-47

    Но надо вывести из выше указанных только:
    Эльдар-50
    Керил-55
    Анна-60

    Если есть возможность помогите подправить запрос или код
    Буду благодарен любой помощи.
    --- Добавлено ---
    Спасибо,
    пока не получается (
     
  4. kazadai90

    kazadai90 Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    103
    Симпатии:
    19
    Код (Text):
    1. SELECT *, YEAR(CURDATE()) - YEAR(born_date) as age FROM main_table WHERE YEAR(CURDATE()) - YEAR(born_date) IN(50, 55, 60) ORDER by born_date
     
    Алекс8 нравится это.
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @kazadai90, timestampdiff точнее. К примеру, мне до 3 октября ещё 34, а разность годов даст 35
     
  6. kazadai90

    kazadai90 Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    103
    Симпатии:
    19
    в текущем году исполняется
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
  8. elikmhs546

    elikmhs546 Новичок

    С нами с:
    6 сен 2019
    Сообщения:
    6
    Симпатии:
    1
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Ну и прекрасно, если уже получилось! На всякий случай, напишу как бы я решал такую задачу:

    Вся фишка в том, что подразумевается будущее время: кому исполняется, а не кому уже есть.

    1. Отказаться от помощи PHP. Это, лять, неуклюже и смешно выкачивать все данные и фильтровать на стороне PHP.
    Вместо этого надо сочинить выражение на SQL для вычисления "возраст человека с датой рождения такой-то на дату такую-то".

    2. Сочинить выражение на SQL, дающее дату "будущего Нового Года".

    3. Использовать выражение "возраст" в условии-фильтре "те, кому на указанную дату X лет". Ну или "чей возраст на указанную дату IN(X, Y, Z)".

    Нам понадобится применить #3 дважды к каждому человеку. Нас интересуют только те, кому сейчас X-1, а на новый год будет X.
    Сейчас сентябрь.Тот, кому уже 50, нам не подойдёт. А вот если сейчас ему 49, а на 1-го января следующего года ему 50, то он наш клиент!

    Псевдокод:
    Код (SQL):
    1. SELECT *
    2. FROM users
    3. WHERE
    4.   возраст(users.birthday, NOW()) IN(39, 44, 49, 54, 59) AND
    5.   возраст(users.birthday, будущийновыйгод()) IN(40, 45, 50, 55, 60)
    --- Добавлено ---
    Добавлю ещё https://dev.mysql.com/doc/mysql-tutorial-excerpt/5.7/en/date-calculations.html
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Я взял таблицу домашних любимцев из ссылки выше и поиграл с ней.
    Данные таковы, что по состоянию на 2019-09-06 в текущем году днюха будет у Chirpy 1998-09-11 и у Whistler 1997-12-09

    И допустим меня интересуют те кому исполнится 21:
    https://www.db-fiddle.com/f/wg2NjibAmj2TSRMSpZ39Lw/0
    --- Добавлено ---
    Screenshot 2019-09-06 at 08.21.21.png