![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли складывать DateTime поля...
Aristarh © (2002-11-08 11:22:00)...в хранимых процедурах IB? IB Expert что-то ругается: expression evaluation not supported. Если складывать нельзя, то это огромный недостаток IB.
MMF (2002-11-08 16:51:00) [1]Ну,я так понял, что тебе нужно разделять время по группам или по другим характеристикам клиентов, по которым потом делать отчеты. К тому же в таблице статистики можно сделать поле WorkDate default Now() чтобы хранить историю работы клиентов по суткам.
Aristarh (2002-11-08 16:43:00) [2]MMF, разве не проще хранить общее время в одном поле, а не создавать доп. таблиц.
>менять период обновления статистики на какой хочешь
Если использовать одно поле, то можно вообще не привязываться к периодам. Что передал в проц., на то и увеличилось время.
MMF (2002-11-08 16:40:00) [3]Поправка Update TimeTable set TotalTime=TotalTime+1
where userID=:client_ID
Просто мне кажется лучше вести учет времени в условных единицах, и менять период обновления статистики на какой хочешь
MMF (2002-11-08 16:30:00) [4]Ладно, забудем про генераторы. Тот же принцип, но в таблице
CREATE PROCEDURE IncTime(
Client_ID integer)
AS
DECLARE VARIABLE UserPresent integer;
begin
:UserPresent=0;
select count(*) from Timetable
where UserID=:Client_ID
into :UserPresent;
if UserPresent=0 then
insert into TimeTable(UserID, TotalTime)
values (:Client_ID, 0);
Update TotalTime set TotalTime=TotalTime+1
where userID=:client_ID
end
Aristarh (2002-11-08 16:26:00) [5]Всем спасибо.
Wolf226 (2002-11-08 16:25:00) [6]Кстати выполнить такой запрос не выйдет
update Statistics
set WorkTime = WorkTime + :Seconds
where ...
Не поддерживается сложение с параметром.
А вот если это же сделать в хранимой процедуре, то должно пройти.
Wolf226 (2002-11-08 16:22:00) [7]Передавать как Double.
Потому что если передавать 2:00:00 как DateTime, то получишь 1.1.1900 2:00:00, если не ошибаюсь.
Wolf226 (2002-11-08 16:17:00) [8]Уточню, хранить в днях, а не в часах или секундах.
12 часов=0.5
Ну чтобы было как в Delphi и не надо было пересчитывать ничего.
Aristarh (2002-11-08 16:13:00) [9]>MMF © (08.11.02 16:06)
>по-твоему загрузит Интербэйс?
Нет не загрузит. Сейчас объясню. Это прога обзвона абонентов. Обзвон идет по определенным группам. Например, группа обзвона должников или группа информирования о тарифе. Один клиент может работать с одной группой, другой - с другой.
В твоем варианте каждому клиенту надо было бы иметь свой генератор, потому, что статистика работы ведется для каждой группы. Групп может быть произвольное кол-во, сл-но произвольное кол-во должно быть и генераторов.
Aristarh (2002-11-08 16:07:00) [10]>MMF © (08.11.02 15:57)
Долго объяснять все нюансы проги и БД, но не подходит однозначно и дело даже не в красоте.
>Wolf226 © (08.11.02 16:01)
>Храни тогда время в double precision.
Пока на этом и остановился.
Передавать время как Double или DateTime?
MMF (2002-11-08 16:06:00) [11]Допустим у тебя два десятка клиентов - получаем 20 очень коротких добавочных транзакций в секунду (в случае 1с), это что, по-твоему загрузит Интербэйс?
Aristarh (2002-11-08 16:02:00) [12]>MMF © (08.11.02 15:57)
Не красиво все это.
Wolf226 (2002-11-08 16:01:00) [13]Храни тогда время в double precision.
И прибавляй к нему по завершению работы.
А на счет варианта MMF я вот что думаю:
Недостатки:
1. Прийдется выбирать между точностью и тормозами.
Хотя если посылать каждую минуту, то будет все OK.
А посылать каждую секунду - это никому не надо, ни тебе, ни программе.
Преймущества.
1. Видно значение с учетом еще не завершившихся сеансов.
2. Если программа вылетит, то в твоем варианте, данные потеряются, а в этом запомнятся.
MMF (2002-11-08 15:57:00) [14]А что тут сложного? К тому же сервер работает быстрее с генераторами, чем с таблицами
Aristarh (2002-11-08 15:49:00) [15]>MMF © (08.11.02 15:46)
>Считай время в генераторе,
Ну... Зачем так сложно? На худой конец можно хранить в интеджер кол-во секунд.
Aristarh (2002-11-08 15:47:00) [16]>Wolf226 © (08.11.02 15:44)
>что должно получиться? 3 часа или 4 часа?
4 часа.
MMF (2002-11-08 15:46:00) [17]Считай время в генераторе, у каждого клиента запускай по таймеру с нужным интервалом gen_id(G_TotalWorkTime, 1) и будешь видеть не после закрытия клиента, а во время работы клиентов накопленное время в выбранных тобой временных интервалах
Wolf226 (2002-11-08 15:44:00) [18]Уточни
Клиент 1: 13:00 - 15:00
Клиент 2: 14:00 - 16:00
что должно получиться?
3 часа или 4 часа?
Aristarh (2002-11-08 15:29:00) [19]Уточнение вопроса:
Есть скажем 3 клиента (не человека, а автоматически работающие программы). При запуске каждого клиента запускается таймер. При завершение работы клиента, клиент должен посмотреть по таймеру сколько часов, минут, секунд (формат TTime) он проработал и отослать это значение серверу в хранимую процедуру.
Сервер должен принять это значение и приплюсовать к некоторому полю. Значений старта и останова клиента сервер не хранит.
Таким образом планируется определять суммарное время работы всех клиентов.
MMF (2002-11-08 15:20:00) [20]Поправка:
for select distinct ID_User from w_seans