【问题标题】:Returning records from the last 3 months only in MySQL仅在 MySQL 中返回最近 3 个月的记录
【发布时间】:2013-03-13 21:40:10
【问题描述】:

我有一个带有时间戳字段的表。如何获取过去 3 个月的数据?

特别是,3 月是我当前的月份,比如说 03/2012。我只需要返回 3 月、2 月和 1 月的记录。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    今天前 3 个月:

    select * from table where timestamp >= now()-interval 3 month;
    

    从月初开始:

    select * from table where timestamp >= last_day(now()) + interval 1 day - interval 3 month;
    

    【讨论】:

    • @StephenKloder : 你能解释一下这个查询吗?这里的'interval 1 day'有什么用?
    • @AlwaysBTryin 是否可以使用 date() 函数通过 php 获取它?
    【解决方案2】:

    要获取当月的第一天,您可以使用:

    DATE_FORMAT(CURDATE(), '%Y-%m-01')
    

    如果当前日期是2013-03-13,则返回2013-03-01,我们可以从这个日期减去2个月得到2013-01-01。您的查询可能是这样的:

    SELECT *
    FROM yourtable
    WHERE data >= DATE_FORMAT(CURDATE(), '%Y-%m-01') - INTERVAL 2 MONTH
    

    【讨论】:

    • +1 表示 INTERVAL 应该是两个月,而不是三个月,因为三个月将包括一月之前的一个月。
    【解决方案3】:

    假设您使用的是 SQL Server(Oracle、MySQL 和其他类似的日期函数),您可以使用 dateadd 函数为当前日期添加或减去一个间隔。

    如果想要整三个月,可以从今天起减去3个月:DATEADD(m,-3,getdate())

    但是,正如您所说,您只需要 1 月、2 月和 3 月的数据。您必须根据今天的日期进行一些计算:dateadd(m,-2, CONVERT(datetime, CONVERT(VARCHAR(2), MONTH(getdate())) + '/01/' + CONVERT(VARCHAR(4), YEAR(getdate()))))

    最后,得到一个类似

    的查询
    SELECT fields 
    FROM table 
    WHERE timestampfield > DATEADD(m,-2, CONVERT(datetime, CONVERT(VARCHAR(2), MONTH(getdate()))  + '/01/' + CONVERT(VARCHAR(4), YEAR(getdate()))))
    

    --- 编辑 --- erf,我刚刚注意到“mysql”标签...您可以在此处获取有关 MySQL 日期函数的更多信息:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

    【讨论】:

    • 帖子说“仅在 ​​MySQL 中”
    【解决方案4】:

    我知道这是一个老问题,但可能会节省其他人的时间并总结上述答案以解决需要 (1) 本月日期和 (2) 前 2 个月日期的情况(显示时很常见)数据统计):

    WHERE ((timestamp >= NOW() - DATE_FORMAT(CURDATE(), '%Y-%m-01'))
    OR  (timestamp >= DATE_FORMAT(CURDATE(), '%Y-%m-01') - INTERVAL 2 MONTH))
    

    【讨论】:

      【解决方案5】:
      WHERE ((timestamp >= NOW() - DATE_FORMAT(CURDATE(), '%Y-%m-01'))
      OR  (timestamp >= DATE_FORMAT(CURDATE(), '%Y-%m-01') - INTERVAL 2 MONTH))
      

      【讨论】:

      • 请在您的答案中添加一些解释,以便其他人可以从中学习
      • A code-only answer is not high quality。虽然此代码可能有用,但您可以通过说明其工作原理、工作方式、何时使用以及它的局限性来改进它。请edit您的回答包括解释和相关文档的链接。
      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多