首页 文章

如何选择上个月的所有参赛作品?

提问于
浏览
2

我有一个表,其中的条目具有DATE字段 . 每个条目都有不同的日期 . 我想选择上个月 registred in the database 的所有条目 . 怎么样?

我试过了:

SELECT * 
  FROM registries 
 WHERE reg_date = DATE_FORMAT(MAX(reg_date), "%m")`

...没有成功

3 回答

  • 0

    基于OMG Ponies的更正查询:

    SELECT 
      r.*
    FROM 
      registries AS r
    JOIN (
      SELECT 
        MAX(t.reg_date) AS max_date
      FROM 
        registries AS t) AS t 
    ON DATE_FORMAT(t.max_date, '%Y-%m') = DATE_FORMAT(r.reg_date, '%Y-%m')
    

    虽然查询的性能不会很好,因为它会在两个计算值上运行JOIN . 我相信它仍然可以正常运行,除非你开始打击数百万条记录 .

    另一方面,您可以通过首先查询MAX(reg_date)来更快地运行它

    SELECT 
      CONCAT(DATE_FORMAT(MAX(r.reg_date), "%Y-%m"), '-01') AS first_day
    FROM 
      registries AS r
    

    然后在查询中注入结果:

    SELECT 
      r.*
    FROM 
      registries AS r
    WHERE
      r.reg_date BETWEEN '<first_day>' AND LAST_DAY('<first_day>')
    

    使用first_day作为前一个查询结果的占位符 . 如果你索引reg_date,这应该运行得非常快 .

    注意:LAST_DAY是仅限MySQL的功能 .

  • 3

    如果您想要最近30天,这将有效

    SELECT * FROM `registries` 
     WHERE `reg_date` > DATE_SUB( NOW(), INTERVAL 30 DAY )
    
  • 1

    这将为您提供上个月(5月)的所有记录:

    SELECT [col,] DATEDIFF(TIMESTAMP,2010-05-01 00:00)dif1,DATEDIFF(TIMESTAMP,2010-05-31 00:00)dif2 FROM tablename HAVING dif1> = 0 AND dif2 <= 0

相关问题