这有点复杂,但这里是:
SELECT IF(MONTH(DATE_ADD('2010-07-02', INTERVAL 28 DAY)) = MONTH('2010-07-02'),
DATE_ADD('2010-07-02', INTERVAL 35 DAY),
DATE_ADD('2010-07-02', INTERVAL 28 DAY));
理由:如果再加上 4 周或 5 周,您仍然是同一天;因为所有月份的长度都在 28 到 35 天之间,如果 4 周后仍然是同一个月,请再增加一周。
更新: 嗯,我没有很好地考虑这一点 - 它适用于一个月的第一个 X,但必须适用于第二个、第三个......(即一个月的第三个 X 可能会返回第二个X 下个月)。尝试#2:
SELECT IF(
CEIL(DAY(DATE_ADD('2010-07-02', INTERVAL 35 DAY)) / 7) = CEIL(DAY('2010-07-02') / 7),
DATE_ADD('2010-07-02', INTERVAL 35 DAY),
DATE_ADD('2010-07-02', INTERVAL 28 DAY));
基本原理:CEIL(DAY(x) / 7) 是 x 的周数。如果加上 5 周后有所不同,则加上 4 周。
更新 2: 大声笑,我今天很糟糕,我真的应该在发帖之前考虑一下……通常将周定义为周一至周日或周日至周一,而不是从月初开始直到6天后。为了弥补这一点:
SELECT IF(
CEIL((DAY(DATE_ADD('2010-07-02', INTERVAL 28 DAY)) - DAYOFWEEK('2010-07-02')) / 7)
= CEIL((DAY('2010-07-02') - DAYOFWEEK('2010-07-02')) / 7),
DATE_ADD('2010-07-02', INTERVAL 28 DAY),
DATE_ADD('2010-07-02', INTERVAL 35 DAY));