Как хранить дату рождения и возраст, чтобы Age мог обновляться ежедневно в PHP / MySQL?

Как я могу хранить Birthdate в MySQL, чтобы я мог легко обновлять каждый возраст на ежедневной основе через Cron Job?

Имеет ли смысл хранить возраст и дату рождения, так что, когда сделаны поиски с участием Возраста, мне не нужно вычислять каждый возраст на лету и тратить ресурсы ЦП?

Если да, то как я должен 1) сохранить дату рождения, и 2) рассчитать возраст каждый день?

Я могу представить, что ежедневный cron-скрипт сначала отфильтровывает пользователя, чей месяц рождения не является текущим месяцем, а затем отфильтровывает тот, чей день рождения не является текущим днем, а затем увеличивается на один возраст каждого оставшегося пользователя.

Имеет ли это смысл? Если да, то как мне это сделать? Есть ли лучший способ сделать все это?

Простой ответ – нет; никогда не хранят возраст людей. Он меняется для каждого человека ежегодно, но, как вы говорите, вы должны проверить, что это правильно для каждого человека ежедневно.

Сохраняйте только дату рождения, а затем вычисляйте возраст при выборе из базы данных. Это только today - date of birth практически не имеет процессоров.

РЕДАКТИРОВАТЬ:

Чтобы расширить мой комментарий в ответе ManseUK, есть также возможность неудачи. Что произойдет, если ваш сервер / база данных не работает? Или ваше обновление не запускается в указанное время? Или кто-то приходит и запускает его вручную после того, как обновление уже было запущено на эту дату? Или кто-то отключает ваш планировщик? Это не опасно, если вы вычисляете Age как вы выбираете из базы данных.

Чтобы выбрать, где возраст составляет от 25 до 30 лет, и при условии, что dateofbirth DATE-столбца, ваш запрос будет выглядеть примерно так:

 select * from users where dateofbirth between date_add( curdate(), interval -30 year ) and date_add( curdate(), interval -25 year ) 

Убедитесь, что users проиндексированы на dateofbirth .

Нет, не храните возраст, просто вычислите его в своих запросах. Что касается дня рождения, я предпочитаю иметь все свои даты / время в timestamps unix (потому что мне не нравится иметь дело с переносимостью в настройках локали, изменяющих формат даты)

Имеет ли смысл хранить возраст

Нет.

Мне не нужно вычислять каждый возраст на лету и тратить ресурсы ЦП?

На самом деле, вы потратите еще миллион «ресурсов ЦП» (о которых вы слишком туманны, чтобы их беспокоило) с вашим повседневным подходом к обновлению.

Есть ли лучший способ сделать все это?

Сохраните дату рождения и вычислите возраст в определенное время

что, если вы хотите узнать всех тех, чей возраст больше 25, но менее 30?

это довольно тривиальный запрос, подобный этому

 WHERE birth_date BETWEEN date_sub(curdate(), INTERVAL 25 YEAR) AND date_sub(curdate(), INTERVAL 30 YEAR) 

запрос будет использовать индекс (если он есть) и, таким образом, будет быстро сверяться, без каких-либо [ненужных] денормализаций

Я собираюсь пойти против большинства всех ответов здесь.

Я бы сохранил оба …

  • обновление возраста быстро и просто – один запрос mysql может запускаться каждый день и его выполнение
  • вычисление возраста занимает много времени, когда у вас много просмотров страниц – количество раз его просмотренных намного превышает количество изменений

Представьте себе сценарий таблицы – таблицу со 100 или 1000 строками, которая показывает возраст человека … сколько времени это займет, чтобы вычислить ???

Я всегда думал, что Stackoverflow рассчитал репутацию динамически, но вы можете увидеть в проводнике данных Stackoverflow, что они не видят – объект User в схеме справа. Его записывали и обновляли каждый раз, когда он менялся – я бы предположил, что это происходит исключительно из-за того, что количество просмотров, которое оно просматривает, намного превышает количество изменений

Я не думаю, что совершенно верно, что вычислительный возраст динамически занимает много памяти. Почему бы не создать таблицу CALENDAR с 365 рядами по 1 строке для каждого дня года. И сохраните список идентификаторов пользователя в день, соответствующий их дню рождения. Для каждого дня просто указывайте запись в таблице за этот день и обновляйте возраст только тех, кто выбран. Это значительно уменьшит сложность, даже когда увеличивается пользовательская база.