从静态日期计算MySQL中的年度到期时间

时间:2012-01-11 16:03:45

标签: mysql sql stored-procedures

这可能很简单,但经过一整天的不间断编码后,我的大脑已经融化了,而且我的纸张用完了......

我正在尝试计算出在存储过程中计算的年度到期公式。

简化表格:

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 个答案:

答案 0 :(得分:2)

是的,您可以使用WHERE month = month and date = date(虽然请注意2月29日作为加入日期。)

然而,这确实意味着您必须扫描到整个表/索引以查找匹配项。如果你有一张大桌子,这可能是个问题。

我认为在这种情况下你最好设置一个到期日期值。然后检查......

WHERE
  expiry_date <= CURDATE()

当某人续约时,您可以更新到期日。 SET expiry_date = DATE_ADD(expiry_date, INTERVAL 1 YEAR)。您可以以12的价格获得13个月的新优惠,并设置到期时间让您保持灵活性。它甚至不受2月29日问题的影响。在可靠性方面;如果您的批处理过程失败,延迟一天运行它不会让您错过一堆人......

答案 1 :(得分:1)

此查询只会检查今天每个Join_Date的月份和日期,如果您于2月29日加入,它将于2月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'))
);

您还应该对表进行索引,以便仅检查那些已过期='FALSE'的记录。

ALTER TABLE Security_Table ADD INDEX (Expired,Join_Date);

试一试!!!