我正在使用ChartJS为票务应用程序构建一些图表。
我要做的是查询MySQL数据库,查找为本月的第一、第二、第四和第四周创建的票。
$month_num_tickets = array();
for ($x=0;$x<=30;$x=$x+6) {
$from = date("Y-m-d 00:00:00",strtotime('first day of this month +'.$x.' days', time()));
$to = date("Y-m-d 23:59:59",strtotime($from, time()));
$get = mysql_query("SELECT id FROM tickets WHERE date_created BETWEEN UNIX_TIMESTAMP('$from') AND UNIX_TIMESTAMP('$to') AND assigned_tech_uid='$uid'") or die(mysql_error());
$month_num_tickets[] = mysql_num_rows($get);
}
不知道如何设置循环。。。
最佳答案
您可以在一个查询中获得一个很好的整洁计数,如下所示:
SELECT
CEIL(DAYOFMONTH(FROM_UNIXTIME(date_created)) / 7) AS week_of_month,
COUNT(id) AS tickets_per_week
FROM tickets
WHERE YEAR(FROM_UNIXTIME(date_created)) = ?
AND MONTH(FROM_UNIXTIME(date_created)) = ?
GROUP BY `week_of_month`
ORDER BY `week_of_month` ASC
注意,如果使用本机datetime或timestamp文件,则可以消除所有这些
FROM_UNIXTIME
转换。这是基于一个“周”是一个月的前7天,而不是基于一周中的特定日期。如果您希望它基于固定的星期(从星期日到星期六或类似的时间),您可以在SELECT中使用WEEK()
函数。可能是这样的:
SELECT
WEEK(FROM_UNIXTIME(date_created), 0) AS week_number,
COUNT(id) AS tickets_per_week
FROM tickets
WHERE YEAR(FROM_UNIXTIME(date_created)) = ?
AND MONTH(FROM_UNIXTIME(date_created)) = ?
GROUP BY `week_number`
ORDER BY `week_number` ASC
这里
week_number
是一个介于0-53之间的值,除了作为聚合的手段之外,不一定对显示有任何意义。我正在为WEEK()
functoid使用模式0,因为这指定了星期六您可以查看此处的定义并确定最适合您的模式:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week这些查询都没有优化,因为您将无法在
date_created
上使用索引。如果您开始将该列类型更改为datetime或timestamp,您可能还希望将WHERE条件更改为稍不易读取但更适合索引的版本,如:WHERE date_created BETWEEN '2014-12-01 00:00:00' AND '2014-12-31 23:59:29'
关于php - PHP日期和时间,每个月的第1、2、3和4周,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27260428/