Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:
Вы пытаетесь использовать ссылочную переменную, значение которой
Nothing
/null
. Если для ссылочной переменной значениеNothing
/null
, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную
blockquote>Nothing
/null
, или вы вызывали функцию, которая установите для этой переменной значениеNothing
/null
.
Простой ответ: нет; никогда не хранят возраст людей. Он меняется для каждого человека ежегодно, но, как вы говорите, вы должны проверить, что он правильный для каждого человека ежедневно.
Сохранять только дату рождения, а затем вычислять возраст при выборе из базы данных.
EDIT:
Чтобы развернуть мой комментарий в ответе ManseUK , есть также возможность сбоя , Что произойдет, если ваш сервер / база данных не работает? Или ваше обновление не запускается в указанное время? Или кто-то приходит и запускает его вручную после того, как обновление уже было запущено на эту дату? Или кто-то отключает ваш планировщик? Нет никакой опасности, если это произойдет, если вы выберете Age
при выборе из базы данных.
Чтобы выбрать, где возраст составляет от 25 до 30 лет, и при условии, что столбец DATE dateofbirth
, ваш запрос будет чем-то вроде :
select *
from users
where dateofbirth between date_add( curdate(), interval -30 year )
and date_add( curdate(), interval -25 year )
Убедитесь, что users
проиндексирован на dateofbirth
.
Я собираюсь пойти против большинства всех ответов здесь.
Я бы сохранил оба ...
Представьте себе табличный сценарий - таблицу со 100 или 1000 строками, которая показывает возраст человека ... сколько времени это займет, чтобы вычислить ???
Я всегда думал, что вычисление Stackoverflow репутацию динамически, но вы можете увидеть в Stackoverflow data explorer , что они не видят - объект User в схеме справа. Он записывался и обновлялся каждый раз, когда он менялся - я бы предположил, что это происходит исключительно из-за того, что количество просмотренных событий намного превышает количество изменений
Я не думаю, что абсолютно верно, что вычислительный возраст динамически занимает много памяти. Почему бы не создать таблицу CALENDAR с 365 рядами по 1 строке для каждого дня года. И сохраните список идентификаторов пользователя в день, соответствующий их дню рождения. Для каждого дня просто указывайте запись в таблице за этот день и обновляйте возраст только тех, кто выбран. Это значительно уменьшит сложность, даже когда увеличивается пользовательская база.
Нет, не храните возраст, просто вычислите его в своих запросах. Что касается дня рождения, я предпочитаю иметь все свои даты / время в timestamps unix (потому что мне не нравится иметь дело с переносимостью в настройках локали, изменяющих формат даты)
Имеет ли смысл хранить Age
blockquote>No.
Мне не нужно вычислять каждый возраст на
blockquote>На самом деле вы потратили бы на миллион больше «ресурсов ЦП» (о которых вы слишком расплывчаты, чтобы беспокоиться) с вашим ежедневный подход к обновлению.
Есть ли лучший способ сделать все это?
blockquote>Сохранить дату рождения и рассчитать возраст в определенное время
что, если вы хотите узнать все те, чей возраст больше 25, но меньше 30?
blockquote>, это довольно тривиальный запрос, подобный этому
WHERE birth_date BETWEEN date_sub(curdate(), INTERVAL 25 YEAR) AND date_sub(curdate(), INTERVAL 30 YEAR)
запрос будет использовать индекс (если он есть) и, таким образом, будет быстро сверяться, без каких-либо [ненужных] денормализаций