我有一个表event
,其中我有一个字段end_date
的记录,所以我的问题是我想要获取记录数,按月分组,end_date
应该在哪里仅在那个月,例如:
如果记录的end_date
为2013-01-01 00:00:00
,则应将其计入January 2013
,我无法执行此操作。我无法把它放在条件,怎么办告诉数据库end_date
应该在它当前分组的月份之间。
SELECT COUNT(*) AS 'count', MONTH(created) AS 'month', YEAR(created) AS 'year' FROM event WHERE is_approved =1 GROUP BY YEAR(created), MONTH(created)
请帮帮我。
编辑:
数据说我有:
Record name end_date
record_1 2013-11-01 00:00:00
record_2 2013-11-30 00:00:00
record_3 2013-12-01 00:00:00
record_4 2013-12-04 00:00:00
record_5 2013-12-06 00:00:00
record_6 2013-12-10 00:00:00
...many more
结果预期为:
Count month year
2 11 2013
4 12 2013
....so on
答案 0 :(得分:5)
试试这个:
SELECT COUNT(1) AS 'count', MONTH(end_date) AS 'month', YEAR(end_date) AS 'year'
FROM event
WHERE is_approved = 1
GROUP BY EXTRACT(YEAR_MONTH FROM end_date);
或强>
SELECT COUNT(1) AS 'count', MONTH(end_date) AS 'month', YEAR(end_date) AS 'year'
FROM event
WHERE is_approved = 1
GROUP BY YEAR(end_date), MONTH(end_date);
<强> :: EDIT :: 强>
<强> 1。结束日期大于特定月份 - 只需在查询中添加条件并以 YYYYMM 格式传递特定月份,而不是 201411
<强> 2。事件已开始 - 再添加一个条件以检查已创建日期是否小于当前日期
SELECT COUNT(1) AS 'count', MONTH(end_date) AS 'month', YEAR(end_date) AS 'year'
FROM event
WHERE is_approved = 1 AND
EXTRACT(YEAR_MONTH FROM end_date) > 201411 AND
DATE(created) <= CURRENT_DATE()
GROUP BY EXTRACT(YEAR_MONTH FROM end_date);
或强>
SELECT COUNT(1) AS 'count', MONTH(end_date) AS 'month', YEAR(end_date) AS 'year'
FROM event
WHERE is_approved = 1 AND
EXTRACT(YEAR_MONTH FROM end_date) > 201411 AND
DATE(created) <= CURRENT_DATE()
GROUP BY YEAR(end_date), MONTH(end_date);
答案 1 :(得分:1)
根据月份和年份汇总计数,因此,如果您跨越多年,您将不会将2013年1月与2014年1月混合,因此也将这些值拉出来,这与该组的基础相同。
至于你的标准,所有这些都在WHERE子句中。在这种情况下,我通过'yyyy-mm-dd'标准日期识别格式从2013年1月1日开始到2014年12月31日结束。也就是说,以及您提供的表的结构,我正在使用“end_date”列。
SELECT
YEAR(end_date) AS EventYear,
MONTH(end_Date) AS EventMonth,
COUNT(*) AS EventCount
FROM
event
WHERE is_approved = 1
and end_date between '2013-01-01' and '2014-12-31'
GROUP BY
YEAR(end_date),
MONTH(end_Date)
现在,如果你想让他们把最新的事件放在最上面,我会把年份和月份下降,所以2014年首先列出,然后是2013年等,其中的月份列为12月(12月),之前其他
GROUP BY
YEAR(end_date) DESC,
MONTH(end_Date) DESC
您的标准几乎可以是日期更改,批准状态,甚至是每个帐户状态的计数都需要,例如(如果您有这样的代码状态值,这些只是示例)
SUM( is_approved = 0 ) as PendingEvent,
SUM( is_approved = 1 ) as ApprovedEvent,
SUM( is_approved = 2 ) as CancelledEvent
每条评论反馈。
对于不同的日期范围,请忽略between子句并将WHERE更改为类似
的内容WHERE end_date > '2014-08-01' or all after a date...
where end_date < '2014-01-01' or all before a date...
他们仍会按月/年分组。如果您希望根据事件的开始日期,只需更改该列,或者对其他列进行更新。
答案 2 :(得分:1)
MySQL有一堆date and time functions可以帮助你解决这个问题。例如:
MONTH()
返回自通过日期起的月份
或
YEAR()
返回年份
因此,您可以获得日期的月份和年份。并将结果分组。
SELECT
COUNT(*) cnt
,MONTH(end_date) month
,YEAR(end_date) year
FROM events
GROUP BY month, year
结果:
cnt month year
2 11 2013
4 12 2013
<强>更新强>
要仅过滤end_date
大于特定月份且已经开始的记录,您只需添加WHERE
子句即可。例如,如果特定月份是2015年2月:
SELECT
COUNT(*) cnt
,MONTH(end_date) month
,YEAR(end_date) year
FROM events
WHERE end_date >= '2015-03-01'
AND created < NOW()
GROUP BY month, year
或者,WHERE
子句的第一部分可以通过以下方式重写,如果您必须将年份和月份作为不同的参数传递,则使用起来可能会更加舒适。
...
WHERE (YEAR(end_date) > 2015
OR (YEAR(end_date) = 2015 AND MONTH(end_date) > 02))
AND created...
答案 3 :(得分:0)
SELECT COUNT(*) AS 'count', MONTH(created) AS 'month', YEAR(created) AS 'year' FROM event WHERE is_approved =1 and month(created) = "the month u want" and year(created) = "the year you want" group by GROUP BY YEAR(created), MONTH(created)
你需要拉月和年...我可以提供帮助但不确定你是如何得到它但是几个月将是01/02/03等,而年份是2013/2014/2015等等