在特定月份mysql之间创建日期

时间:2014-12-19 10:47:45

标签: mysql sql date select group-by

我有一个表event,其中我有一个字段end_date的记录,所以我的问题是我想要获取记录数,按月分组,end_date应该在哪里仅在那个月,例如:

如果记录的end_date2013-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

4 个答案:

答案 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等等