mysql выборка с группировкой по часам

nezabor
На сайте с 19.07.2010
Offline
152
7355

есть таблица для выбора и вот ка-то танцы с бубном не помогают :crazy:

нужно сгруппировать выборку по часам(выборка будет за 1 или несколько дней) и посчитать сколько записей по данному часу

формат врмени в поле 2013-10-31 09:32:43.291536

---------- Добавлено 09.11.2013 в 01:39 ----------

моэжно конечно и так

SELECT (SELECT count(id) FROM `queue_log` WHERE event = 'ABANDON' AND TIME LIKE '%2013-10-31 00%') as '00-00',
(SELECT count(id) FROM `queue_log` WHERE event = 'ABANDON' AND TIME LIKE '%2013-10-31 01%') as '01-00',
(SELECT count(id) FROM `queue_log` WHERE event = 'ABANDON' AND TIME LIKE '%2013-10-31 02%') as '02-00'...

но по мне это как-бы не кошерно

Чудес не бывает...
R
На сайте с 18.12.2009
Offline
92
#1

"не кошерно" хранить в базе такое значение в 1 поле - "2013-10-31 09:32:43.291536", и тем более делать выборку времени оператором LIKE.

nezabor
На сайте с 19.07.2010
Offline
152
#2
rerighter:
"не кошерно" хранить в базе такое значение в 1 поле - "2013-10-31 09:32:43.291536",

это не ко мне - к астериску

а вот так кстати можно сделать то я хотел

SELECT HOUR(time), COUNT(*) as qti
FROM `queue_log`
WHERE event = 'ABANDON'
AND time LIKE '2013-10-31%'
GROUP BY HOUR(time)

может у кого и есть мысли по поводу LIKE лучше пока ничего не придумал

doctorpc
На сайте с 12.07.2009
Offline
112
#3
nezabor:
может у кого и есть мысли по поводу LIKE лучше пока ничего не придумал

Вместо Like обычно использую:


time > '2013-10-31' AND time < '2013-10-31 23:59:59'

или то же самое с BETWEEN.

Если хотите поиграться предварительно с расчетом даты +1 день, то можно


time > '2013-10-31' AND time < '2013-11-01'

Попробывал Ваш вариант, и MYSQL почему-то не хочет использовать индекс, хотя есть такая возможность.

И тем более не делайте '%2013-10-31%' ( с % сначала). В этом варианте индекс на time точно не будет использоваться.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#4

Разработчики MySQL трахались, трахались, придумывая функции даты и времени, а Вы тут бац им в лоб ЛАЙКом:D

Подпись))
nezabor
На сайте с 19.07.2010
Offline
152
#5
Милованов Ю.С:
Разработчики MySQL трахались, трахались, придумывая функции даты и времени, а Вы тут бац им в лоб ЛАЙКом

я уж думал КЕП кончился, ан нет...

вот Милованов Ю.С, ты наверное думал что только ты знаешь, где в интернетах страница с описанием функции даты для MySQL?

---------- Добавлено 09.11.2013 в 17:41 ----------

doctorpc:
Попробывал Ваш вариант, и MYSQL почему-то не хочет использовать индекс, хотя есть такая возможность.

странна

doctorpc:
И тем более не делайте '%2013-10-31%' ( с % сначала). В этом варианте индекс на time точно не будет использоваться.

ну я собственно так и написал

---------- Добавлено 09.11.2013 в 17:44 ----------

doctorpc:
Вместо Like обычно использую:

PHP код:
time*>*'2013-10-31'*AND*time*<*'2013-10-31*23:59:59'*
или то же самое с BETWEEN.

с BETWEEN я вот так юзаю

time BETWEEN '2013-10-31 00:00:00' AND '2013-11-01 23:59:59'
doctorpc
На сайте с 12.07.2009
Offline
112
#6
nezabor:
ну я собственно так и написал

В предыдущем сообщении вы писали

AND time LIKE  '2013-10-31%'

что принципиально отличается от

AND time LIKE  '%2013-10-31%'

В последнем варианте Mysql ни при каких обстоятельствах не будет использовать индекс на time, т.к. сначала стоит "%".

IL
На сайте с 20.04.2007
Offline
435
#7
нужно сгруппировать выборку по часам(выборка будет за 1 или несколько дней) и посчитать сколько записей по данному часу

Between-ом интервал выбирать, который (за 1 или несколько дней) разбивать нужно, а группировку по часам можно так:

GROUP BY SUBSTRING(`time`,1,13) -- дёргать этот кусок: '2013-10-31 09'

Будет ли быстрее, чем вычисление Month+DAY+HOUR - проверять.

UPD как вариант

GROUP BY DATE_FORMAT(`time`,'%y%m%d%H')

UPD2 если выборки нужны частые и есть возможность изменять структуру - возможно, есть смысл вынести в отдельную колонку с индексом.

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий