Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > sum(UNIX_TIMESTAMP())


Автор: jimbo 24.1.2012, 17:38
есть таблица, допустим входов и выходов людей.
столбцы номер пользователя, дата и время входа, дата и время выхода. 

Мне надо найти количество отработанных часов конкретного пользователя за последние 10 входов. 
пишу что-то вроде:
Код


select sum ( unix_timestamp(close_time)-unix_timestamp(open_time)) from table where login = 12345 limit 10;
select unix_timestamp(close_time),close_time,unix_timestamp(open_time),open_time,unix_timestamp(close_time)-unix_timestamp(open_time) from table where login = 12345 limit 10;




Второй запрос я экспортирую в эксель и считаю сумму unix_timestamp(close_time)-unix_timestamp(open_time) и получаю отличный результат от первого запроса. 

Как правильно считать сумму datetime-ов в секундах с  1970 года?

Автор: Akina 24.1.2012, 17:48
limit без order by - уже бессмыслица.

Автор: jimbo 24.1.2012, 17:58
Цитата(Akina @ 24.1.2012,  17:48)
limit без order by - уже бессмыслица.

не важно, я использовал order by close_time desc limit 10 - одно и тоже

Автор: tzirechnoy 24.1.2012, 21:30
Первый запрос (по причине отстутствия group by) всегда возвращает одну строку (с суммой по всем входам), limit безсмысленнен.

Автор: Zloxa 25.1.2012, 09:23
Цитата(jimbo @  24.1.2012,  17:38 Найти цитируемый пост)
Второй запрос я экспортирую в эксель и считаю сумму unix_timestamp(close_time)-unix_timestamp(open_time) и получаю отличный результат от первого запроса. 

Первый запрос считает вам сумму разницы по всему содержимому таблицы. Лимит, будучи расширением конструкции order by, применяется к результату выполнения запроса, а не к исходному набору данных, а так как запрос вернет лишь одну запись,  как уже верно заметил tzirechnoy, в нем нет никакого смысла. Второй запрос возвращает лишь десять первых попавшихся записей (любых, т.е. будучи дважды запущенным в разные моменты времени, он может вернуть разные результаты, на что уже намекнул Akina). Не удивительно, что суммы не сходятся. Ведь сравниваются суммы всех записей и любых десяти.

Для того чтобы суммы сошлись, вам следует 
1) определить критерии ранжирования (сортировки), не допускающие не однозначности. Лучший способ добиться этого, включить первичный ключ в критерий сортировки
2) Применить этот критерий ранжирования к обоим запросам
3) Аггрегат считать по результату подзапроса т.е:
Код

select sum ( unix_timestamp(close_time)-unix_timestamp(open_time)) from (select * from table where login = 12345 order by id limit 10) s


Добавлено @ 09:28
Цитата(Zloxa @  25.1.2012,  09:23 Найти цитируемый пост)
Для того чтобы суммы сошлись, вам следует

еще есть вариант - избавиться от лимита вообще. В результате суммы должны будут сойтись.

Автор: jimbo 25.1.2012, 11:44
всем большое спасибо за участие. С вашей помощью я добился наилучших результатов. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)