在MySQL中,我可以做类似的事情:
SELECT DATE_ADD('2010-07-02',INTERVAL 1 MONTH)
然后返回:
2010-08-02
那很好......现在有一个MySQL功能,我可以用它来查找同一天提前一个月的日期。例如,2010年7月的第一个星期五是2010年7月2日。有没有一种简单的方法可以找到2010年8月的第一个星期五带有SQL语句的内容?
答案 0 :(得分:1)
它有点复杂,但这里有:
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));
答案 1 :(得分:0)
这可以解决这个问题吗?
SELECT DATE_ADD(
DATE_SUB(
DATE_ADD('2010-07-06', INTERVAL 1 MONTH),
INTERVAL DAYOFWEEK(DATE_ADD('2010-07-06', INTERVAL 1 MONTH)) DAY
),
INTERVAL DAYOFWEEK('2010-07-06') DAY
)