这可能很简单,但经过一整天的不间断编码后,我的大脑已经融化了,而且我的纸张用完了......
我正在尝试计算出在存储过程中计算的年度到期公式。
简化表格:
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')
谢谢你们。
答案 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);
试一试!!!