Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Возраст по дате рождения
 
 автор: tAleks   (25.10.2009 в 08:43)   письмо автору
 
 

Подскажите, как вычислить возраст (полных лет) по дате рождения. Спс.

  Ответить  
 
 автор: cheops   (25.10.2009 в 10:56)   письмо автору
 
   для: tAleks   (25.10.2009 в 08:43)
 

Самый простой вариант (однако, не самый точный) заключается в следующем
SELECT (TO_DAYS(NOW()) - TO_DAYS(putdate))/365.25 AS putdate FROM tbl

putdate - календарный столбец таблицы tbl.

  Ответить  
 
 автор: Trianon   (25.10.2009 в 11:22)   письмо автору
 
   для: cheops   (25.10.2009 в 10:56)
 

Drago в соседней ветви предложил логику

SELECT
  `birthdate`, 
  FLOOR( 
        ( REPLACE(        CURDATE(), '-','') 
         -REPLACE(DATE(`birthdate`), '-','')
        )/10000
    ) AS `Years` 
  FROM tbl

  Ответить  
 
 автор: cheops   (25.10.2009 в 13:22)   письмо автору
 
   для: Trianon   (25.10.2009 в 11:22)
 

Хм... любопытно, действительно изящное решение проблемы подсчета возраста.

  Ответить  
 
 автор: Саня   (25.10.2009 в 13:51)   письмо автору
 
   для: Trianon   (25.10.2009 в 11:22)
 

От REPLACE можно избавиться:
SELECT 
  `birthdate`,  
  FLOOR(  
        ( CURDATE() - DATE(`birthdate`) ) / 10000 
    ) AS `Years`  
  FROM tbl

Вот ещё один вариант
SELECT
  `birthdate`,
  FLOOR(
    PERIOD_DIFF(
      DATE_FORMAT(CURDATE(), '%Y%m'),
      DATE_FORMAT(`birthdate`, '%Y%m')
    ) / 12
  ) AS `Years`

  Ответить  
 
 автор: Trianon   (25.10.2009 в 13:57)   письмо автору
 
   для: Саня   (25.10.2009 в 13:51)
 

>От REPLACE можно избавиться:SELECT
> `birthdate`,
> FLOOR(
> ( CURDATE() + 0 - DATE(`birthdate`) + 0 ) / 10000
> ) AS `Years`
> FROM tbl

красиво.
на заднем плане сидела мысль, что есть какой-то простой способ взять представление без дефисов, но я её не стал копать... не удивлюсь, что если убрать оба + 0 , то тоже покатит.

  Ответить  
 
 автор: Саня   (25.10.2009 в 14:15)   письмо автору
 
   для: Trianon   (25.10.2009 в 13:57)
 

> если убрать оба + 0 , то тоже покатит
Я уже успел это проверить и отредактировать пост до вашего комментария )

  Ответить  
 
 автор: tAleks   (25.10.2009 в 11:22)   письмо автору
 
   для: cheops   (25.10.2009 в 10:56)
 

А в чем заключается не точность?

Более точные варианты есть?

  Ответить  
 
 автор: Trianon   (25.10.2009 в 11:25)   письмо автору
 
   для: tAleks   (25.10.2009 в 11:22)
 

Неточность заключается в том, что год - единица плавающая.
И в зависимости от даты рождения, N лет при одном и том же N означает разный промежуток линейного времени.
Так что в терминах линейного времени считать года слегка некорректно. На что cheоps и намекнул.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования