代码之家  ›  专栏  ›  技术社区  ›  John Kurlak

在同一天提前一个月找到日期

  •  0
  • John Kurlak  · 技术社区  · 14 年前

    在MySQL中,我可以做如下的事情:

    选择“添加日期”(2010-07-02,间隔1个月)

    结果是:

    2010-08-02

    太好了…现在有没有一个mysql函数,我可以用它来查找同一天提前一个月的日期。例如,2010年7月2日是2010年7月1日星期五。有没有一种简单的方法可以找到2010年8月1日星期五的SQL语句?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Amadan    14 年前

    它有点复杂,但这里是:

    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,但必然适用于第二个月,第三个月…(即每月的第3个X可能会在下个月返回第2个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));
    
        2
  •  0
  •   John Kurlak    14 年前

    这能起作用吗?

    
    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
            )