mysql — дата и время PHP, получение 1-й, 2-й, 3-й и 4-й недели в месяце

Я использую ChartJS, чтобы построить несколько графиков для билетов.

То, что я пытаюсь сделать, это запросить в базе данных MySQL количество билетов, созданных за 1-ю, 2-ю, 4-ю и 4-ю неделю текущего месяца.

  $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);
}

Не уверен, как настроить цикл …

1

Решение

Вы можете получить хороший счетчик в одном запросе, как это:

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 днями месяца, а не на определенных днях недели. Если вы хотите, чтобы это основывалось на фиксированных неделях (с воскресенья по субботу или около того), вы можете просто использовать WEEK() функция в SELECT вместо этого.

Это может выглядеть так:

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 и не обязательно будет иметь какое-либо значение для отображения, кроме как средство для агрегирования. Я использую режим 0 для WEEK() functoin как это определяет вс-субботу недели. Вы можете посмотреть здесь определения и определить, какой режим подходит вам лучше всего: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

Ни один из этих запросов не оптимизирован, потому что вы не сможете использовать индекс для date_created , Если у вас есть возможность изменить этот тип столбца на дату или время, вы, возможно, захотите изменить условие WHERE на более легкую для чтения, но более удобную для индекса версию, например:

WHERE date_created BETWEEN '2014-12-01 00:00:00' AND '2014-12-31 23:59:29'
3

Другие решения

Я думаю, что это должно работать для вас

SELECT YEARWEEK(date_created), MONTH(date_created), COUNT(*) FROM tickets
WHERE date_created BETWEEN UNIX_TIMESTAMP('$from') AND UNIX_TIMESTAMP('$to') AND
assigned_tech_uid='$uid'
GROUP BY YEARWEEK(date_created), MONTH(date_created)
0