【问题标题】:How to get records from last Month (not last 30 days) in mysql query [duplicate]如何在mysql查询中获取上个月(不是最近30天)的记录[重复]
【发布时间】:2018-01-30 19:47:29
【问题描述】:

我在 MySQL 查询中有一部分需要选择上个月的记录,而不是过去 30 天的记录

例如,如果当前月份是 1 月,那么我需要有上个月的记录,即 12 月,但它应该只显示 2017 年 12 月的记录,不包括往年的记录。

我目前正在使用以下 SQL 部分。

$sql .= " AND MONTH(checkup_date) = MONTH(NOW() - INTERVAL 1 MONTH)";

它显示了数据库中所有 12 月的记录,即 2017 年 12 月、2016 年 12 月等。

我什至尝试了以下

$sql .= " YEAR(checkup_date) AND MONTH(checkup_date) = MONTH(NOW() - INTERVAL 1 MONTH)";

但仅当上个月不早于一月时才有效 即如果当前月份是 2 月,它将起作用,所以上个月将是 1 月,年份将是 2018 年

但在我的情况下,当前月份是一月,所以上个月是十二月,但这里的年份是 2018 年,所以它不是也不会显示任何记录。

所以请大家帮我修复这个查询,以便我可以得到最后一年,以防当前月份是一月,而在另一种情况下,年份仍然是当前年份。

感谢您帮助解决问题。

【问题讨论】:

    标签: mysql sql datetime


    【解决方案1】:

    这是在mysql中获取属于上个月的表中所有行的查询:

    SELECT * FROM table
    WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
    AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
    

    另一种选择是:

    SELECT * FROM table
    WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
    1 MONTH)
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      where checkup_date < curdate() - interval (1 - day(curdate())) day and
            checkup_date >= (curdate() - interval (1 - day(curdate())) day) - interval 1 month
      

      通过不使用checkup_date 上的函数,方法可以利用适当的索引作为该列。

      【讨论】:

        【解决方案3】:

        获取上个月的

        select DATE_ADD("2018-01-10", INTERVAL -1 MONTH)
        

        【讨论】:

          猜你喜欢
          • 2016-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          相关资源
          最近更新 更多