Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Суммировать время в SQLITE / 17 сообщений из 17, страница 1 из 1
20.11.2008, 08:45
    #35664586
Bingo_Bongo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
Всем доброго!
Помогите пожалуйста с синтаксисом SELECT'а. Необходимо просуммировать время с группировкой.
Делаю следующим образом:
Код: plaintext
1.
SELECT sum(DURATION), internal FROM ATS GROUP BY internal
А в результате вместо суммы выходит '0.0'
...
Рейтинг: 0 / 0
20.11.2008, 14:04
    #35665639
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
А в каком виде хранятся данные в DURATION и какой их смысл ?

--
RemObjects AnyDAC 2.0 / 1.12
...
Рейтинг: 0 / 0
20.11.2008, 15:11
    #35665868
Bingo_Bongo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DATE	          TIME	internal	CO	     DURATION
 17 . 11 . 2008 	 9 : 06 : 00 	 115 	         09 		 0 : 05 : 15 	 
 17 . 11 . 2008 	 9 : 07 : 00 	 115 	         09 		 0 : 00 : 08 	 
 17 . 11 . 2008 	 9 : 07 : 00 	 115 	         09 		 0 : 03 : 08 	 
 17 . 11 . 2008 	 9 : 08 : 00 	 115 	         09 		 0 : 00 : 08 	 
 17 . 11 . 2008 	 9 : 09 : 00 	 115 	         09 		 0 : 03 : 07 	 
 17 . 11 . 2008 	 9 : 11 : 00 	 115 	         09 		 0 : 00 : 08 	 
 17 . 11 . 2008 	 9 : 12 : 00 	 115 	         09 		 0 : 00 : 06 	 
 17 . 11 . 2008 	 9 : 18 : 00 	 115 	         09 	      	 0 : 08 : 02 	 
 17 . 11 . 2008 	 9 : 18 : 00 	 115 	         09 		 0 : 00 : 12 	 
Таблица примерно следующего вида. нужно посчитать общее время звонков.
...
Рейтинг: 0 / 0
20.11.2008, 16:29
    #35666148
Bingo_Bongo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
Я так понял, что вычисление суммы времени нет. Может как-то можно тогда duration перевести в секунды (INTEGER), затем посчитать, а затем обратно преобразовать его в тип данных типа time?
...
Рейтинг: 0 / 0
20.11.2008, 17:54
    #35666419
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
Bingo_BongoЯ так понял, что вычисление суммы времени нет. Может как-то можно тогда duration перевести в секунды (INTEGER), затем посчитать, а затем обратно преобразовать его в тип данных типа time?Начать надо с того, что типа данных time нет. Есть только строковое представление времени... Читай тут:
http://www.sqlite.org/datatype3.html
http://www.sqlite.org/lang_datefunc.html

Подобную задачу можно в принципе решить вот так:
Код: plaintext
1.
2.
3.
4.
5.
create table t1(id integer not null, t time);
insert into t1 values( 1 , time('00:01:02'));
insert into t1 values( 2 , time('00:03:04'));
insert into t1 values( 2 , time('00:05:06'));

select id, time(sum(strftime('%H',t)* 3600 )+strftime('%M',t)* 60 )+sum(strftime('%S',t)), 'unixepoch') from t1 group by id;
...
Рейтинг: 0 / 0
20.11.2008, 18:17
    #35666472
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
White Owl
Подобную задачу можно в принципе решить вот так:
Код: plaintext
1.
2.
3.
4.
5.
create table t1(id integer not null, t time);
insert into t1 values( 1 , time('00:01:02'));
insert into t1 values( 2 , time('00:03:04'));
insert into t1 values( 2 , time('00:05:06'));

select id, time(sum(strftime('%H',t)* 3600 )+strftime('%M',t)* 60 )+sum(strftime('%S',t)), 'unixepoch') from t1 group by id;


Ей-ей, что за ужасы вы рассказываете. Достаточно поменять формат хранения времени с интервала ('00:01:02') на секунды ('00:01:02' = 62) и задача решается тривиально и без проблем с производительностью. В текущем варианте возникнут проблемы, например, при биллинговании только тех звонков, которые превышают нетарифицируемый интервал.
...
Рейтинг: 0 / 0
20.11.2008, 18:32
    #35666503
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
MBGЕй-ей, что за ужасы вы рассказываете. Страшно? А что делать?

MBGДостаточно поменять формат хранения времени с интервала ('00:01:02') на секунды ('00:01:02' = 62) и задача решается тривиально и без проблем с производительностью.Да, конечно, я на это и намекал, напоминая автору топика что в sqlite на самом деле нет типа данных time. Действительно хранить количество секунд намного удобнее, надежнее и проще со всех точек зрения.
Но если таблица уже существует и уже содержит время в виде "времени"? Тогда и прийдется прибегать к кривым и страшным методам типа показаного ранее.
...
Рейтинг: 0 / 0
20.11.2008, 19:50
    #35666667
Bingo_Bongo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
Очень интересно. Значит я ввелся в заблуждение когда оформлял базу в SQLiteadmin'e там предлагают именно типы данных DATE и TIME. Тогда конечно лучше забивать время в секундах. Только как выводить его потом в нормальном для пользователя виде(%H:%M:%S) через SELECT разумеется?
...
Рейтинг: 0 / 0
21.11.2008, 02:04
    #35666946
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
Bingo_BongoОчень интересно. Значит я ввелся в заблуждение когда оформлял базу в SQLiteadmin'e там предлагают именно типы данных DATE и TIME. Тогда конечно лучше забивать время в секундах. Только как выводить его потом в нормальном для пользователя виде(%H:%M:%S) через SELECT разумеется?

Проще всего забиндить пользовательскую функцию, которая преобразует время для отображения:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
db function showdate showdate
proc showdate {seconds} {
  clock format $seconds -f %H:%M:%S -gmt  1 
}

select showdate( 100 );
 00 : 01 : 40 

Пример на тикле, но тоже самое можно сделать на любом языке.
...
Рейтинг: 0 / 0
21.11.2008, 17:44
    #35668871
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
Bingo_BongoОчень интересно. Значит я ввелся в заблуждение когда оформлял базу в SQLiteadmin'e там предлагают именно типы данных DATE и TIME. Тогда конечно лучше забивать время в секундах. Только как выводить его потом в нормальном для пользователя виде(%H:%M:%S) через SELECT разумеется?А вот для этого как раз и существует функция time()
Код: plaintext
1.
select time( 65 , 'unixepoch')
--   00 : 01 : 05 
...
Рейтинг: 0 / 0
21.11.2008, 17:45
    #35668877
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
MBGПроще всего забиндить пользовательскую функцию, которая преобразует время для отображения:А еще проще будет почитать список предопределенных функций: strftime(), time(), date(), datetime()... Они очень даже мощные :)
...
Рейтинг: 0 / 0
21.11.2008, 18:32
    #35668967
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
White OwlОни очень даже мощные :)
Это очень мягко сказано !

PS: Я хотел ответить выше аналогично, но уже все сказанно.
...
Рейтинг: 0 / 0
21.11.2008, 20:51
    #35669136
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
White OwlMBGПроще всего забиндить пользовательскую функцию, которая преобразует время для отображения:А еще проще будет почитать список предопределенных функций: strftime(), time(), date(), datetime()... Они очень даже мощные :)

В формат оракла и из формата оракла тем не менее проще преобразовывать пользовательской функцией. При желании форматировать, например, в виде "1 минута 5 секунд" - тоже. Не стоит забывать, что возможности встраиваемой СУБД легко расширяются функциями приложения.
...
Рейтинг: 0 / 0
21.11.2008, 23:23
    #35669231
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
MBGВ формат оракла и из формата оракла тем не менее проще преобразовывать пользовательской функцией.
Уточните пожалуйста что такое "формат оракла" и зачем в него преобразовывать при работе с sqlite?

MBGПри желании форматировать, например, в виде "1 минута 5 секунд" - тоже.
Код: plaintext
select id, strftime('%M minutes %S seconds', t) from t1;
И никаких пользовательских функций :)
...
Рейтинг: 0 / 0
22.11.2008, 02:42
    #35669364
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
White OwlMBGВ формат оракла и из формата оракла тем не менее проще преобразовывать пользовательской функцией.
Уточните пожалуйста что такое "формат оракла" и зачем в него преобразовывать при работе с sqlite?

Даты вида 1-APR-05, полученные при выгрузке из оракла. Преобразовывать понятно зачем - для оптимизации запросов по этим данным. Например, есть месячная выгрузка из биллинга, кидаем ее в эскулайт на отдельный сервер и пользователи могут строить любые отчеты в любом количестве, не перегружая основной биллинг. Благо сложные объединения таблиц эскулайт выполняет блестяще и данные хранит весьма компактно.

White OwlMBGПри желании форматировать, например, в виде "1 минута 5 секунд" - тоже.
Код: plaintext
select id, strftime('%M minutes %S seconds', t) from t1;
И никаких пользовательских функций :)

И как при необходимости сменить форматирование вы поступите - будете по всему коду искать и заменять этот паттерн? Лучше создать функцию reportview для отображения даты в отчетах, к примеру, и вызывать ее во всех отчетах, тогда изменение формата отображения времени в отчетах потребует модификацию одной лишь функции.
...
Рейтинг: 0 / 0
24.11.2008, 17:47
    #35672396
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
MBGДаты вида 1-APR-05, полученные при выгрузке из оракла.Ой, жуть какая! Ну да, такие даты действительно прийдется обрабатывать пользовательскими функциями.

MBGИ как при необходимости сменить форматирование вы поступите - будете по всему коду искать и заменять этот паттерн? Лучше создать функцию reportview для отображения даты в отчетах, к примеру, и вызывать ее во всех отчетах, тогда изменение формата отображения времени в отчетах потребует модификацию одной лишь функции.Два пункта:
- Формат представления даты для пользователя это чисто клиентская задача. И решать ее в любом случае будет ГУЙ. Движку БД клиентский формат данных глубоко по барабану, лично я с датами в БД работаю только в одном формате - yyyy-mm-dd. Все остальные форматы - известны только ГУЮ.
- Ни разу не встречал задачу в которой по настоящему пришлось бы заниматься сменой формата даты. Если программа изначально готовится для международного рынка, значит i18n и подобные ему словари закладываются еще при старте проекта. И опять таки - язык приложения это чисто ГУЕвая задача. БД, будь она хоть трижды встраиваемой с форматами даты никак взаимодействовать не должна. Иначе при смене локали для ГУЯ старая база либо не сможет работать совсем, либо серьезно затормозиться потому что теперь ей прийдется тратить время на вызов каких-то внешний процедур коневертации данных.
...
Рейтинг: 0 / 0
24.11.2008, 18:21
    #35672497
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммировать время в SQLITE
White OwlДва пункта:
- Формат представления даты для пользователя это чисто клиентская задача. И решать ее в любом случае будет ГУЙ. Движку БД клиентский формат данных глубоко по барабану, лично я с датами в БД работаю только в одном формате - yyyy-mm-dd. Все остальные форматы - известны только ГУЮ.
- Ни разу не встречал задачу в которой по настоящему пришлось бы заниматься сменой формата даты. Если программа изначально готовится для международного рынка, значит i18n и подобные ему словари закладываются еще при старте проекта. И опять таки - язык приложения это чисто ГУЕвая задача. БД, будь она хоть трижды встраиваемой с форматами даты никак взаимодействовать не должна. Иначе при смене локали для ГУЯ старая база либо не сможет работать совсем, либо серьезно затормозиться потому что теперь ей прийдется тратить время на вызов каких-то внешний процедур коневертации данных.

Стандартная ситуация - приложение генерит sql-запрос, который потом автоматически мапится в отчет. Никакой дополнительной обработки не нужно, есть прямое соответствие таблица результата запроса - таблица/график/etc. отчета. Формат хранения даты в базе стандартный, секунды с начала эпохи юникс, а вот отображаться дата может в самом различном виде. Например, пользователи могут попросить, чтобы временной интервал меньше 3-х минут отображался как строка "отлично", до 10-ти минут - как "хорошо", и свыше этого - как "удовлетворительно". Базу менять не надо, приложение менять не надо, достаточно лишь изменить содержимое функции отображения даты. Раз мы можем функции приложения и СУБД запустить в едином адресном пространстве, не нужно делать дополнительную обработку после проведения выборки.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Суммировать время в SQLITE / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]