我有一个带有时间戳字段的表。我如何获取过去3个月的数据?
特别是,3月是我当前的月份,比如 03/2012 。我需要从3月,2月和1月份返回记录。
答案 0 :(得分:59)
今天前3个月:
select * from table where timestamp >= now()-interval 3 month;
从月初开始:
select * from table where timestamp >= last_day(now()) + interval 1 day - interval 3 month;
答案 1 :(得分:10)
要获得当月的第一天,您可以使用:
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
答案 2 :(得分:2)
假设您正在使用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()))))
---编辑--- 呃,我刚注意到“mysql”标签......你可以在这里获得有关MySQL日期函数的更多信息:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
答案 3 :(得分:1)
我知道这是一个古老的问题,但是可能为了需要(1)当前月份的日期和(2)前2个月的日期(显示时常见)可能节省其他时间并总结上述答案数据统计):
WHERE ((timestamp >= NOW() - DATE_FORMAT(CURDATE(), '%Y-%m-01'))
OR (timestamp >= DATE_FORMAT(CURDATE(), '%Y-%m-01') - INTERVAL 2 MONTH))