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

--
RemObjects AnyDAC 2.0 / 1.12
...
Рейтинг: 0 / 0
Суммировать время в SQLITE
    #35665868
Bingo_Bongo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Суммировать время в SQLITE
    #35666148
Bingo_Bongo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понял, что вычисление суммы времени нет. Может как-то можно тогда duration перевести в секунды (INTEGER), затем посчитать, а затем обратно преобразовать его в тип данных типа time?
...
Рейтинг: 0 / 0
Суммировать время в SQLITE
    #35666419
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Суммировать время в SQLITE
    #35666472
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
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
Суммировать время в SQLITE
    #35666503
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGЕй-ей, что за ужасы вы рассказываете. Страшно? А что делать?

MBGДостаточно поменять формат хранения времени с интервала ('00:01:02') на секунды ('00:01:02' = 62) и задача решается тривиально и без проблем с производительностью.Да, конечно, я на это и намекал, напоминая автору топика что в sqlite на самом деле нет типа данных time. Действительно хранить количество секунд намного удобнее, надежнее и проще со всех точек зрения.
Но если таблица уже существует и уже содержит время в виде "времени"? Тогда и прийдется прибегать к кривым и страшным методам типа показаного ранее.
...
Рейтинг: 0 / 0
Суммировать время в SQLITE
    #35666667
Bingo_Bongo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень интересно. Значит я ввелся в заблуждение когда оформлял базу в SQLiteadmin'e там предлагают именно типы данных DATE и TIME. Тогда конечно лучше забивать время в секундах. Только как выводить его потом в нормальном для пользователя виде(%H:%M:%S) через SELECT разумеется?
...
Рейтинг: 0 / 0
Суммировать время в SQLITE
    #35666946
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
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
Суммировать время в SQLITE
    #35668871
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bingo_BongoОчень интересно. Значит я ввелся в заблуждение когда оформлял базу в SQLiteadmin'e там предлагают именно типы данных DATE и TIME. Тогда конечно лучше забивать время в секундах. Только как выводить его потом в нормальном для пользователя виде(%H:%M:%S) через SELECT разумеется?А вот для этого как раз и существует функция time()
Код: plaintext
1.
select time( 65 , 'unixepoch')
--   00 : 01 : 05 
...
Рейтинг: 0 / 0
Суммировать время в SQLITE
    #35668877
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGПроще всего забиндить пользовательскую функцию, которая преобразует время для отображения:А еще проще будет почитать список предопределенных функций: strftime(), time(), date(), datetime()... Они очень даже мощные :)
...
Рейтинг: 0 / 0
Суммировать время в SQLITE
    #35668967
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlОни очень даже мощные :)
Это очень мягко сказано !

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

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

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

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

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

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

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

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


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