MySQL: получение количества записей за определенный период времени - PullRequest
1 голос
/ 10 июня 2009

Так что я пытаюсь сделать это немного сложно. Я пытаюсь придумать SQL-запрос, который сможет вернуть счет за указанные сроки. Итак, у меня есть таблица «V». Вот некоторые основные данные из таблицы v

Table v
_____________
id    p_id    created_at
 1     1      2009-06-09 18:54:17
 2     2      2009-06-09 21:51:24
 3     2      2009-06-10 18:53:51
 4     1      2009-06-10 01:20:36
 5     1      2009-06-10 11:20:36

Как правило, я хочу получить результаты за указанный период времени (час, день, неделя, месяц, год). У меня это работает несколько дней ... но я не могу вернуть результаты для таймфреймов с нулевым счетом. По сути, я хочу дать ему временные рамки и разделитель (час, день и т. Д.) И иметь возможность получить количество строк из таблицы v за этот период времени.

Это то, что я сейчас пробовал:

select count(*) as count, date_format(created_at, "%m/%d/%y") as date from v where p_id = 56 group by date_format(created_at, "%m/%d/%y");

Возвращает

+-------+-------------------------------------+
| count | date_format(created_at, "%m/%d/%y") |
+-------+-------------------------------------+
|     3 | 06/09/09                            | 
+-------+-------------------------------------+

Но это не учитывает временные рамки. Есть идеи?

Ответы [ 5 ]

1 голос
/ 10 июня 2009

Я бы порекомендовал сделать это следующим образом:

SELECT COUNT(*) AS `num`
FROM `table`
WHERE `created_at` >= '2009-09-06 00:00:00'
AND `created_at` < '2009-09-07 00:00:00'

т.е. прямой запрос в пределах вашего диапазона дат / времени, который решает проблему разных масштабов времени и так далее. При достаточном количестве записей в таблице индекс на created_at может стать бесполезным, но он все равно должен работать лучше, чем сравнение с результатом DATE_FORMAT; если только оптимизатор запросов не окажется намного умнее, чем я считаю, он будет запускать DATE_FORMAT для каждой строки и сравнивать результат, а не извлекать пользу из индексации вообще.

Я подозреваю, что есть некоторые вещи, которые я не обрабатываю в вашей ситуации, которые делают это неработоспособным для вас, или вы бы уже делали это таким образом, но я полагаю, мне придется подождать отзывов, чтобы увидеть, что это есть.

0 голосов
/ 12 ноября 2009

Если у вас нет какой-либо записи за определенный период времени, сервер MySQL не может получить сумму за этот период. Все предложенные решения (включая ваше) работают, но не возвращают ни одной строки за определенный период времени без записей.

Если вы используете этот запрос в приложении, я предлагаю вам создать строки с нулевым счетом вручную в вашей сетке или что вы используете для отображения результатов.

0 голосов
/ 31 августа 2009

Из отметок времени, а не дат:

ВЫБЕРИТЕ COUNT (*), DATE_FORMAT (FROM_UNIXTIME (созданный_ат), "% m.% Y") КАК mDate FROM v GROUP BY mDate

0 голосов
/ 10 июня 2009
SELECT COUNT(*), created_at
FROM v
WHERE p_id = 56 
   and created_at >= sometime and created_at <= dateadd(hour,1,sometime)

Вы также можете добавить дни, годы и т. Д., Чтобы получить желаемый период времени.

См. Эту ссылку для более подробной информации: http://msdn.microsoft.com/en-us/library/ms186819.aspx

0 голосов
/ 10 июня 2009
SELECT
  COUNT(*) AS cnt,
  DATE_FORMAT(created_at, "%m/%d/%y") AS my_date
FROM
  v
WHERE
  p_id = 56 AND 
  created_at BETWEEN first_date AND second_date
GROUP BY 
  DATE_FORMAT(created_at, "%m/%d/%y");
...