Отбор по времени

Amarok

Новичок
Отбор по времени

Здравствуйте

Имеется таблица
time_sec - int(10)
length - smallint(5)

Например:
1160582404 | 10
1160582411 | 15
1160582413 | 8

Соответственно time_sec - дата TIMESTAMP
Нужно просуммировать значение столбца length в период, например, с 00:00 часов до 08:00 и с 08:00 до 23:59 соответственно.

select
SUM(CASE WHEN (DATE_FORMAT(FROM_UNIXTIME(time_sec), '%H:%i:%s') BETWEEN '00:00:00' AND '08:00:00') THEN length ELSE 0 END) as night,
SUM(CASE WHEN (DATE_FORMAT(FROM_UNIXTIME(time_sec), '%H:%i:%s') NOT BETWEEN '00:00:00' AND '08:00:00') THEN length ELSE 0 END) as day
from test

Кажется мне что это не лучший вариант. Можно ли это сделать как-то иначе?

Заранее спасибо.
 

alpine

Новичок
Amarok
Почему нельзя создать индекс и сделать два человеческих запроса по условию WHERE? Для чего этот изврат?

-~{}~ 12.10.06 17:07:

Зачем unix timestamp хранить в базе, почему не использовать mysql timestamp ? Какие преимущества кроме явных недостатков?
 

Amarok

Новичок
Смысл затеи в том, что есть такая дивная программка ulogd.. Так вот подобного вида таблицу генерит именно она. Соответственно на основании этих данных хочется посчитать трафик (ночной и дневной).. Поэтому такая и проблема...
 

hermit_refined

Отшельник
Немного разумней - HOUR(FROM_UNIXTIME(time_sec)).

А вообще - не понимаю, зачем данные по каждому пакету писать в бд. Лучше периодически обрабатывать логи и записывать только нужную информацию.

P.S. Я бы написал
SELECT SUM(length) AS traffic, HOUR(FROM_UNIXTIME(time_sec)) >= 8 AS day FROM test GROUP BY day
 

alpine

Новичок
Amarok
Сделай еще одно поле в которое будет писать mysql свой таймстамп при добавлении записи и работай без преобразований из unix timestamp.
Ты не ответил на еще два вопроса.
hermit_refined
В ulog-е настраивается сколько пакетов аккумулирует правило, правда там не гибко.
 

Amarok

Новичок
Спасибо всем.
Решил формировать новую таблицу из ulog-ской, и к ней уже строить запросы.
 
Сверху