Рассчитать годовой срок действия в MySQL от статической даты - PullRequest
1 голос
/ 11 января 2012

Это может быть просто, но мой мозг растаял после долгого дня безостановочного кодирования, и у меня быстро кончается бумага ...

Я пытаюсь вычислить формулу годового срока действия для вычисления в хранимой процедуре.

Упрощенная таблица:

Security_Table
-----------------
User_ID [int]
Join_Date [DateTime]
Expired [VARCHAR]

Таким образом, если пользователь, присоединившийся к 2010-01-11, Expired обновится до "TRUE" сегодня, то же самое относится и к тем, кто присоединился к 2009-01-11, так как это повторяющийся срок действия.

Я выполняю процедуру ежедневно, выполняя запланированные задания. Будет ли достаточно сравнить день и месяц? Очевидно, что для високосного года.

UPDATE Security_Table SET Expired = 'TRUE' WHERE DATE_FORMAT(Join_Date,'%m-%d') = DATE_FORMAT(NOW(),'%m-%d')

Спасибо, ребята.

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Да, вы можете использовать WHERE month = month and date = date. (хотя будьте осторожны с 29 февраля в качестве даты присоединения.)

Это, однако, означает, что вам нужно сканировать всю таблицу / индекс в поисках совпадений. Если у вас большой стол, это может быть проблемой.

Я думаю, что в этом случае вам лучше установить значение срока годности. Тогда проверяя это ...

WHERE
  expiry_date <= CURDATE()

Когда кто-то обновляется, вы можете обновить срок действия. SET expiry_date = DATE_ADD(expiry_date, INTERVAL 1 YEAR). У вас может быть новое предложение на 13 месяцев по цене 12, и установка срока действия позволяет вам быть таким гибким. Это даже невосприимчиво к проблеме 29 февраля. С точки зрения надежности; если ваш пакетный процесс завершится неудачно, запуск его на день позже не заставит вас скучать по группе людей ...

1 голос
/ 11 января 2012

Этот запрос будет просто проверять месяц и день каждого Join_Date против сегодняшнего дня. Если вы присоединились 29 февраля, срок его действия истекает 28 февраля или истекает через 4 года.

UPDATE Security_Table
SET Expired='TRUE'
WHERE Expired='FALSE'
AND 
(
    (DATE_FORMAT(Join_Date,'%m-%d')='02-29' AND DATE_FORMAT(NOW(),'%m-%d')='02-28')
    OR
    (DATE_FORMAT(Join_Date,'%m-%d') = DATE_FORMAT(NOW(),'%m-%d'))
);

Вам следует также проиндексировать таблицу, чтобы проверялись только те записи, которые имеют срок действия = «ЛОЖЬ».

ALTER TABLE Security_Table ADD INDEX (Expired,Join_Date);

Дай попробовать !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...