Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2019, 02:03   #1
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию Посчитать общее время после выполнения запроса

Доброй ночки.
Есть запрос, который выводит поля с указанием продолжительности времени (это результат разница между временем)
Код:
sql.Add('SELECT user, date, TIME_FORMAT(TIMEDIFF(time_e, time_b), ''%H:%i'') AS `timer`,');
то есть, в каждой записи есть что-то типа "02:15" - тип поля TIME
Мне в Edit1.text нужно вывести сумму всех этих часов и минут.
Попробовал так:
Код:
    
While not ADOQuery_main.Eof do
    begin
      timer := timer + ADOQuery_main.FieldByName('timer').AsDateTime;
      ADOQuery_main.Next;
    end;
- Оказалось пипец как долго!!!
Есть правильные идеи? Научите!
iskurt вне форума Ответить с цитированием
Старый 18.03.2019, 08:51   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Оказалось пипец как долго
Там что немеренно записей? Отдельным запросом SUM(TIME_TO_SEC(TIMEDIFF(time_e, time_b))). А в программе превратить в количество часов минут секунд.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.03.2019, 09:08   #3
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

Записей к примеру 3000-5000, но когда я подсчитываю своим способом, я прям вижу как курсор пробегает сверху вниз все поля для пересчета))), и скорость, скажу я вам, примерно 40 записей в секунду
То есть просто сделать отдельный запрос?
iskurt вне форума Ответить с цитированием
Старый 18.03.2019, 09:18   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

2.
Цитата:
я прям вижу как курсор пробегает сверху вниз все поля для пересчета)))
http://www.programmersforum.ru/showthread.php?t=310188
Цитата:
3) Собственно проблема решилась благодаря этому совету ("отключи "визуальное" сопровождение прохода по DataSet").
1.!!!
Цитата:
То есть просто сделать отдельный запрос?
да именно!
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.03.2019, 12:20   #5
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Да, именно так и помогло!!! Спасибо!
iskurt вне форума Ответить с цитированием
Старый 18.03.2019, 13:10   #6
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

Мужики, ну помогите еще логикой....
Общая сумма этого времени получается от нескольких дней, до нескольких месяцев...
Код:
  sDBGrid1.DataSource.DataSet.DisableControls;
  While not ADOQuery_main.Eof do
  begin
    timer := timer + ADOQuery_main.FieldByName('timer').AsDateTime;
    ADOQuery_main.Next;
  end;
  DecodeDateTime(timer, mYear, mMonth, mDay, mh, mm, ms, mms); // для примера
  ShowMessage(DateTimeToStr(timer));
на выходе получаю "09.01.1900 14:41:00"
А вот пересчитать как?
Допустим получу кол-во дней, ок, умножаем на 24... а вот если дело до нескольких месяцев дойдет? Мне нужно будет выдергивать кол-во дней в определенном месяце и умножить на 24?
iskurt вне форума Ответить с цитированием
Старый 18.03.2019, 13:13   #7
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

К примеру... "16.05.1900 19:54:00"
(16*24)+(31*24)+(28*24)+(31*24)+(30 *24)+19
так?
iskurt вне форума Ответить с цитированием
Старый 18.03.2019, 13:22   #8
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

В общем понятно, пришлось все же вернуться к Запросу Который посчитал правильно кол-во часов ))))
Код:
sql.Add('SELECT ROUND(SUM(TIME_TO_SEC(TIME_FORMAT(TIMEDIFF(time_e, time_b), ''%H:%i'')))/3600, 2) AS `time_summ`');
Думал с датасетом будем приятнее работать
iskurt вне форума Ответить с цитированием
Старый 18.03.2019, 15:31   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

TIME_FORMAT что делает в запросе? Только утяжеляет его. И если в программе, то суммировать не DateTime, а время переведенное в секунды, а дальше уж хоть в часы превращай, хоть в дни или года )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.03.2019, 15:48   #10
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
TIME_FORMAT что делает в запросе? Только утяжеляет его. И если в программе, то суммировать не DateTime, а время переведенное в секунды, а дальше уж хоть в часы превращай, хоть в дни или года )
Ха, точно, теперь всё просто ГУТТ!!!
К стати таки да! Вы правы. а то просто скопировал с другого запроса.
Спасибо, оптимизирую.

Последний раз редактировалось iskurt; 18.03.2019 в 15:54.
iskurt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Большое время выполнения запроса 5cek БД в Delphi 4 25.07.2014 09:37
Как можно уменьшить время выполнения запроса. ajevgen PHP 4 07.09.2011 15:55
Окно после выполнения запроса mortal2010 Microsoft Office Access 6 25.02.2011 13:18
время выполнения SOAP запроса hotman Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 0 04.06.2009 13:32
Посчитать время выполнения процедуры SeЯgey Помощь студентам 1 24.05.2009 18:38