首页 文章

MySQL:查询以获取上个月的所有行

提问于
浏览
67

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

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

9 回答

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

    这是另一种选择 . 假设您有一个索引 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' )
    
  • 151

    如果没有未来日期......

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

    测试 .

  • 2

    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)
    

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

    SELECT * FROM table
    WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
    1 MONTH)
    
  • 16
    SELECT *
    FROM  yourtable
    where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
    

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

  • 1

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

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

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

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

    问候 - saqib

  • 1

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

    如果对date_created进行索引,则此方法将能够利用索引,因为它不会对字段值应用任何转换函数 .

  • 2
    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)
    

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

相关问题