【问题标题】:Query to get all rows from previous month查询以获取上个月的所有行
【发布时间】:2011-01-06 14:35:35
【问题描述】:

我需要选择我的数据库中上个月创建的所有行。

例如,如果当前月份是 1 月,那么我想返回 12 月创建的所有行,如果月份是 2 月,那么我想返回 1 月份创建的所有行。我的数据库中有一个date_created 列,其中列出了以这种格式创建的日期:2007-06-05 14:50:17

【问题讨论】:

    标签: mysql


    【解决方案1】:

    单一条件的替代方案

    SELECT * FROM table
    WHERE YEAR(date_created) * 12 + MONTH(date_created)
        = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
    

    【讨论】:

      【解决方案2】:
      SELECT *  FROM table  
      WHERE  YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
      AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
      

      【讨论】:

      • 您是否尝试过运行该查询?据我所知,它不会选择前几个月的所有日期(如:从一月到整个二月返回数据),而是从一个月前的同一天开始的范围内返回数据
      • 我做了一些改变,现在检查它是否有效
      【解决方案3】:
      SELECT *
      FROM  yourtable
      where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
      

      这应该返回上一个日历月的所有记录,而不是过去 30 天或 31 天的记录。

      【讨论】:

      • 我忘了说...这应该返回上一个日历月的所有记录,而不是过去 30 天或 31 天的记录。
      • 在我看来,这应该是公认的答案,因为它比公认的答案更简单,但提供相同的结果
      【解决方案4】:
      WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
        AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY) 
      

      这对我有用(选择从上个月创建的所有记录,无论您本月运行查询的哪一天)

      【讨论】:

        【解决方案5】:

        这是获取上个月记录的查询:

        SELECT *
        FROM `tablename`
        WHERE `datefiled`
        BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
        MONTH )
        AND 
        LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
        MONTH ) )
        

        问候 - 萨奇布

        【讨论】:

        • 您是否尝试过运行该查询?据我所知,它不会选择前几个月的所有日期(如:从一月到整个二月返回数据),而是从一个月前的同一天开始的范围内返回数据
        【解决方案6】:

        尽管已经选择了这个问题的答案,但是,我相信最简单的查询将是

        SELECT * 
        FROM table 
        WHERE 
        date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
        

        【讨论】:

        • 不,不完全是。请参阅我对您对@hobodave 给出的答案的评论的回复
        • @MattPassell 你说得对,我误解了这个问题。我错过了结果应该仅限于上个月的记录。
        【解决方案7】:

        或者hobodave's answer

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

        您可以使用 EXTRACT 实现相同的效果,使用 YEAR_MONTH 作为单位,因此您不需要 AND,如下所示:

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

        【讨论】:

        • 这几个月都很好用,但不幸的是没有 YEAR_WEEK temporal interval,所以如果你需要几周而不是几个月,你就不得不回退到 hobodave 的答案。
        【解决方案8】:

        如果没有未来日期...

        SELECT * 
        FROM   table_name 
        WHERE  date_created > (NOW() - INTERVAL 1 MONTH);
        

        经过测试。

        【讨论】:

        • 我认为他们正在寻找不同的东西。即上个月的所有记录(即 2012 年 10 月 1 日 - 10 月 31 日 23:59:59)。上面的查询将返回最近约 30 天,从今天的日期和 时间
        【解决方案9】:

        这是另一种选择。假设您有一个索引的 DATEDATETIME 类型字段,这应该使用索引,因为格式化的日期将在使用索引之前进行类型转换。当您使用EXPLAIN 查看时,您应该会看到range 查询而不是index 查询。

        SELECT
            * 
        FROM
            table
        WHERE 
            date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) 
        AND
            date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' )
        

        【讨论】:

        • +1。对索引更友好。你也可以在DATE_FORMAT 周围抛出一个STR_TO_DATE,所以它总是处理日期对象。
        【解决方案10】:

        select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');

        如果你的 date_created 被索引,这个将能够利用索引,因为它不会对字段值应用任何转换函数。

        【讨论】:

        • @ggiroux - 它必须在应用 LIKE 之前将日期转换为字符类型。
        • 确实是的,但仍然比所选答案有改进,恕我直言(IFF date_created 已编入索引)
        【解决方案11】:
        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 date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
        • @GhazanfarMir 您的查询与问题不太匹配,而上面的答案却是。你的返回上个月今天到昨天之间的行。
        • @MattPassell 很抱歉,between 包括边界。它也包括当前日期。为什么/如何限制在昨天?请详细说明?
        • 我明白你的意思.. 是的,你是对的.. 我的查询不是 OP 想要的.. 我误解了这个问题
        • 如果current_date 不是今天,而是客户提供的随机日期怎么办?
        猜你喜欢
        • 2017-03-30
        • 2021-11-28
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        相关资源
        最近更新 更多