我最近完成了编写报告工具的任务,以便历史地获取多个数据。 但是我遇到了困难的地步。我过去几个月都无法获得我的数据。
故事: 用户获得一个字段,在该字段中,他可以键入他想要获取历史记录(已过去几个月)的时间,例如:我想要过去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个月。因此,我将向用户显示的数据是错误的,因为它在一个月中的某个地方开始,在另一个月的中间某个地方结束。我希望这段时间从月的第一天开始,到月末的最后一天结束。
我的第一个想法是,我可以从当前日期减去已经过去的天数,以获得上个月的第一天,但我不知道该怎么做。我也不知道如何得到那个月的名字。
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以使用PHP函数mktime和strtotime根据当前日期计算任意日期。
因此,我不是使用笨拙,不可读的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)";