我正在使用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/

10-10 21:40