Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Корректный подсчет количества календарных дней  (Прочитано 12707 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
4y4z
Участник

ru
Offline Offline
Младший саппорт


« : 01-06-2010 11:00 » new

В таблице содержатся строки с полями: device_id(int),gmtime (int),position(float).
Primary key составной: device_id,gmtime
Собственно, каждая строчка таблицы представляет собой сообщение о текущей координате транспортного средства в данный момент времени.
Необходимо выполнить учет количества календарных дней, в течение которого поступали координаты от транспортного средства.
В качестве входных параметров задаются временной интервал для подсчета (формат: ЧЧ.ММ.СС ДД.ММ.ГГГГ) и device_id.
Планирую сделать так:
1.Получить массив значений формата ДД.ММ.ГГГГ (array1) из входного временного интервала
2.Выбрать все записи, соответствующие входным условиям.
3.Выделить из полученных записей только дни в формате ДД.ММ.ГГГГ (array2)
4.Сравнить элементы array1 и array2, чтобы определить: сколько элементов массива array1 присутствуют в массиве array2. (определим тем самым искомое количество дней)

Какие пункты этой обработки лучше переложить на сервер СУБД, чтобы процесс подсчета не затянулся надолго?

Примечание:
СУБД MySQL 5.0, Database Engine MyISAM, размер таблицы 2.4 гигабайта, количество записей: >41 000 000
Язык разработки Java.
Сервер может быть как локальный так и удаленный.
« Последнее редактирование: 01-06-2010 11:49 от 4y4z » Записан

Ищу работу. (разработка/тестирование/отладка)
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 01-06-2010 11:52 » 

Если тебе нужен подсчет дней - то все делается одним запросом. Естественно - выполняться он будет на сервере
Записан
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 01-06-2010 11:59 » 

Только вот каким образом у тебя задан gmtime ?

Запрос приблизительно такой:
Код:
SELECT COUNT(*) AS Cnt
FROM (
SELECT DISTINCT DT(gmtime) AS DT
FROM Table
WHERE (device_id=:DeviceID)
AND (gmtime BETWEEN :StartTime AND :StopTime)
) Q1
где DT() - функция обрезки времени, т.е. на вход - дата/время, на выходе - чистая дата. Это не функция MySQL - ее нужно подобрать в зависимости от твоего формата gmtime.

P.S. Я здесь только показал структуру запроса. Подогнать его под MySQL - твоя задача...
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 01-06-2010 12:06 » 

table (id, timestamp)

select count(*) from table where id=:id_dev and timestamp between :TimeBegin and TimeEnd

Здесь ты получишь число всех событий.

select discint dateformat(ts) from
   (select timestamp as ts from table where id=:id_dev and timestamp between :TimeBegin and TimeEnd)

аргументы для dateformat подобрать самому)
« Последнее редактирование: 01-06-2010 12:07 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
4y4z
Участник

ru
Offline Offline
Младший саппорт


« Ответ #4 : 01-06-2010 12:09 » 

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_datediff  - здесь перечислены все функции, о которых упомянули ответчики.
Записан

Ищу работу. (разработка/тестирование/отладка)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 01-06-2010 12:11 » 

Kivals опередил - более правильным запросом.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
4y4z
Участник

ru
Offline Offline
Младший саппорт


« Ответ #6 : 02-06-2010 07:42 » 

Только вот каким образом у тебя задан gmtime ?

Запрос приблизительно такой:
Код:
SELECT COUNT(*) AS Cnt
FROM (
SELECT DISTINCT DT(gmtime) AS DT
FROM Table
WHERE (device_id=:DeviceID)
AND (gmtime BETWEEN :StartTime AND :StopTime)
) Q1
где DT() - функция обрезки времени, т.е. на вход - дата/время, на выходе - чистая дата. Это не функция MySQL - ее нужно подобрать в зависимости от твоего формата gmtime.

P.S. Я здесь только показал структуру запроса. Подогнать его под MySQL - твоя задача...
GMtime в моем случае соответствует обычному UnixTime
Записан

Ищу работу. (разработка/тестирование/отладка)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 02-06-2010 09:10 » 

SELECT FROM_UNIXTIME(875996580);
        -> '1997-10-04 22:23:00'
что-нибудь говорит?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 02-06-2010 16:28 » 

В данном конкретном случае можно просто использовать целочисленное деление на число секунд в сутках
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines