根据日期时间字段提取条目,并按月和年组织

时间:2013-01-29 20:59:33

标签: php mysql sql group-by

我有一个名为'tasks'的表,其中包含一堆信息(分配给谁,创建日期,到期日期等)

'task_due_date'字段是普通的日期时间字段。我想通过这个组织所有的任务;例如,如果您在2013年3月和4月份有4个任务,我想将它们分成每个月的div,以便它们可以折叠以便于阅读。

我想知道最好的方法是什么?我怎样才能让它面向未来?我知道我可以手动编写每年的PHP循环(如果月份是1,这样做,如果月份是2这样做,等等),但似乎必须有一个更有效的方式。

它需要了解多年,所以2013年1月应该比2014年1月有所下降。

我的梦想解决方案是:

  • 2013年3月:任务1,任务2
  • 2013年4月:任务1
  • 2013年5月:任务1,任务2

以下是我的任务表的SQL:

CREATE TABLE IF NOT EXISTS `tasks` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`task_status` int(11) unsigned NOT NULL DEFAULT '1',
`task_creation_date` datetime NOT NULL,
`task_due_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`task_completed_date` datetime DEFAULT NULL,
`task_priority` bigint(20) unsigned NOT NULL,
`task_assignment` int(11) unsigned NOT NULL,
`task_description` longtext NOT NULL,
`task_type` bigint(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `task_type` (`task_type`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2698 ;

3 个答案:

答案 0 :(得分:1)

如果会有很多任务,你可以考虑生成'每月'div并通过AJAX加载检索实际任务。

您可以通过将查询分组来显示每年/每月的任务数量;

SELECT 
   COUNT(*) AS number_of_tasks, 
   YEAR(task_due_date) AS task_year, 
   MONTH(task_due_date) AS task_month 
FROM tasks 
GROUP BY task_year, task_month;

使用此方法,创建div,然后使用此查询检索(通过AJAX)所选年/月内的所有任务

SELECT *
FROM tasks 
   WHERE YEAR(task_due_date) = 2013, 
   AND MONTH(task_due_date) = 1 

答案 1 :(得分:0)

您需要进行group by SQL查询

看到这可能会有所帮助

MySQL group by day with datetime mixing same dates from different months

答案 2 :(得分:0)

这会给你你的,接近你的“梦想解决方案”,虽然我可能有点过于字面化了:

SELECT
  CONCAT(
    DATE_FORMAT( `task_due_date`, '%M %Y' ),
    ': ',
    GROUP_CONCAT( CONCAT( 'Task ', `ID` ) SEPARATOR ', ' )
  ) AS `tasks_per_month`
FROM
  `tasks`
GROUP BY
  DATE_FORMAT( `task_due_date`, '%M %Y' )
ORDER BY
  `task_due_date`;