根据当前日期从完整月份的时段中选择数据

时间:2014-09-09 11:05:02

标签: php mysql sql date timestamp

我最近完成了编写报告工具的任务,以便历史地获取多个数据。 但是我遇到了困难的地步。我过去几个月都无法获得我的数据。

故事: 用户获得一个字段,在该字段中,他可以键入他想要获取历史记录(已过去几个月)的时间,例如:我想要过去3个月的数据。他输入他的值,发送数据和(应该)获得这样的输出(因为我们现在有9月):

X data in August,
Y data in July,
Z data in June.

我的查询是:

SELECT * FROM table WHERE (publish_up between date_sub(NOW(), 
INTERVAL ".$history." MONTH)
AND date_sub(now(), INTERVAL " . -- $history . " MONTH))
AND created_by = '$editorID' AND state = 1 AND sectionid in (1,2,3)";

但有了这个,显然我总是从现在得到数据 - 1个月。因此,我将向用户显示的数据是错误的,因为它在一个月中的某个地方开始,在另一个月的中间某个地方结束。我希望这段时间从月的第一天开始,到月末的最后一天结束。

我的第一个想法是,我可以从当前日期减去已经过去的天数,以获得上个月的第一天,但​​我不知道该怎么做。我也不知道如何得到那个月的名字。

4 个答案:

答案 0 :(得分:1)

这将为您提供上个月的结束:

DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 DAY)

对于月份名称,请参阅here

答案 1 :(得分:1)

您可以使用PHP函数mktimestrtotime根据当前日期计算任意日期。

因此,我不是使用笨拙,不可读的SQL函数,而是直接在PHP中计算所需的时间段:

$period_end = mktime(0,0,0, date('n'), 1, date('Y')); // first of current month, time 00:00:00
$period_begin = strtotime('-3 months', $period_end);

然后,您可以将这些嵌入到SQL查询中,如下所示:

$query = "SELECT * FROM table WHERE publish_up BETWEEN '" .
         date('Y-m-d H:i:s', $period_begin) ."' AND '" .
         date('Y-m-d H:i:s', $period_end) ."' AND " 
         "created_by = '$editorID' AND state = 1 AND sectionid in (1,2,3)";

答案 2 :(得分:0)

SELECT * 
FROM   table 
WHERE  create_by = '$editorID' AND 
       state = 1 AND 
       sectionid in (1,2,3) AND
       published_up > DATE_FORMAT(NOW() ,'%Y-%m-01') - INTERVAL ".$history." MONTH

答案 3 :(得分:0)

使用EXTRACT YEAR_MONTH可以轻松查看日期是否在所需的月份内。

"SELECT MONTHNAME(publish_up) as month, SUM(some_column), ... 
 FROM mytable 
 WHERE extract(year_month from publish_up) BETWEEN
       extract(year_month from (now() - INTERVAL ".$history." MONTH)) AND
       extract(year_month from now())
 AND created_by = '".$editorID."' AND state = 1 AND sectionid in (1,2,3)
 GROUP BY MONTHNAME(publish_up)";