Форум: "Базы";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
ВнизМожно ли складывать DateTime поля... Найти похожие ветки
← →
Aristarh (2002-11-08 11:22) [0]...в хранимых процедурах IB? IB Expert что-то ругается: expression evaluation not supported. Если складывать нельзя, то это огромный недостаток IB.
← →
Aristarh (2002-11-08 11:37) [1]Печально... Никто не знает :(
На счетчике посетителей 900 с копейками, будем ждать хотя бы до 1500
← →
Wolf226 (2002-11-08 12:13) [2]Ну что должно получится в результате "1-oct-2001"+"21-oct-2002" - a?
Другое дело вычитание
select cast("21-oct-2002" as date)-cast("1-oct-2001" as date) from rdb$database
получил 385
← →
Aristarh (2002-11-08 12:33) [3]>Wolf226 © (08.11.02 12:13)
>Ну что должно получится в результате "1-oct-2001"+"21-oct-2002" - a?
Да, но я считаю, что DateTime хранит значение даты и времени в виде десятичного числа. Поэтому вроде бы можно складывать.
← →
Wolf226 (2002-11-08 13:00) [4]Смысла нет в этой операции, поэтому она не поддерживается.
Если считать как ты то даты можно было бы и умножать и делить, хотя это бессмыслено.
Единственно, жаль, что не поддерживается AVG для поля Date.
Но это можно обойти так
select cast("1.1.1900" as date)+avg( datein-"1.1.1900") from lt_listofstaff_itr
← →
Aristarh (2002-11-08 13:05) [5]>Wolf226 © (08.11.02 13:00)
Мне нужно складывать время. Можно ли сделать так:
update Statistics
set WorkTime = WorkTime + cast(:Seconds as double precision)
where ...
Здесь Seconds - переменная DateTime
← →
Wolf226 (2002-11-08 13:24) [6]Откуда берется Seconds?
← →
Wolf226 (2002-11-08 13:40) [7]Разница двух Дат - double precision
← →
Aristarh (2002-11-08 14:05) [8]>Wolf226 © (08.11.02 13:24)
>Откуда берется Seconds?
Передается в хранимую процедуру как DateTime
>Разница двух Дат - double precision
А сумма двух дат тоже double precision?
← →
Wolf226 (2002-11-08 14:14) [9]Суммы двух дат не существует.
А что за задача вообще у тебя?
← →
Aristarh (2002-11-08 14:40) [10]Это еще один сегодняшний пост на эту тему, в нем объясняется задача:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1036744808&n=1
← →
Wolf226 (2002-11-08 14:56) [11]Предположим - есть 2 поля в таблице сеансов W_Seans
типа date D_Start и D_End (ну там еще ID, ID_USER)
Время проведенное в днях пользователем за программой
select sum(D_end-D_Start) from W_Seans
where id_user=:id_user
← →
Aristarh (2002-11-08 15:11) [12]>Wolf226 © (08.11.02 14:56)
>Время проведенное в днях пользователем за программой
Немного не то. Нужно время не отдельно взятого клиента, а суммарное время работы всех клиентов в часах, минутах, сек.
← →
MMF (2002-11-08 15:18) [13]А если
:Total=0;
for select ID_User from w_seans
into :Id_user
do
begin
:UserTime=0;
Select (sum(D_end-D_Start) from W_Seans
where id_user=:id_user
into :UserTime;
:Total=Total+UserTime;
end
suspend
← →
MMF (2002-11-08 15:20) [14]Поправка:
for select distinct ID_User from w_seans
← →
Aristarh (2002-11-08 15:29) [15]Уточнение вопроса:
Есть скажем 3 клиента (не человека, а автоматически работающие программы). При запуске каждого клиента запускается таймер. При завершение работы клиента, клиент должен посмотреть по таймеру сколько часов, минут, секунд (формат TTime) он проработал и отослать это значение серверу в хранимую процедуру.
Сервер должен принять это значение и приплюсовать к некоторому полю. Значений старта и останова клиента сервер не хранит.
Таким образом планируется определять суммарное время работы всех клиентов.
← →
Wolf226 (2002-11-08 15:44) [16]Уточни
Клиент 1: 13:00 - 15:00
Клиент 2: 14:00 - 16:00
что должно получиться?
3 часа или 4 часа?
← →
MMF (2002-11-08 15:46) [17]Считай время в генераторе, у каждого клиента запускай по таймеру с нужным интервалом gen_id(G_TotalWorkTime, 1) и будешь видеть не после закрытия клиента, а во время работы клиентов накопленное время в выбранных тобой временных интервалах
← →
Aristarh (2002-11-08 15:47) [18]>Wolf226 © (08.11.02 15:44)
>что должно получиться? 3 часа или 4 часа?
4 часа.
← →
Aristarh (2002-11-08 15:49) [19]>MMF © (08.11.02 15:46)
>Считай время в генераторе,
Ну... Зачем так сложно? На худой конец можно хранить в интеджер кол-во секунд.
← →
MMF (2002-11-08 15:57) [20]А что тут сложного? К тому же сервер работает быстрее с генераторами, чем с таблицами
← →
Wolf226 (2002-11-08 16:01) [21]Храни тогда время в double precision.
И прибавляй к нему по завершению работы.
А на счет варианта MMF я вот что думаю:
Недостатки:
1. Прийдется выбирать между точностью и тормозами.
Хотя если посылать каждую минуту, то будет все OK.
А посылать каждую секунду - это никому не надо, ни тебе, ни программе.
Преймущества.
1. Видно значение с учетом еще не завершившихся сеансов.
2. Если программа вылетит, то в твоем варианте, данные потеряются, а в этом запомнятся.
← →
Aristarh (2002-11-08 16:02) [22]>MMF © (08.11.02 15:57)
Не красиво все это.
← →
MMF (2002-11-08 16:06) [23]Допустим у тебя два десятка клиентов - получаем 20 очень коротких добавочных транзакций в секунду (в случае 1с), это что, по-твоему загрузит Интербэйс?
← →
Aristarh (2002-11-08 16:07) [24]>MMF © (08.11.02 15:57)
Долго объяснять все нюансы проги и БД, но не подходит однозначно и дело даже не в красоте.
>Wolf226 © (08.11.02 16:01)
>Храни тогда время в double precision.
Пока на этом и остановился.
Передавать время как Double или DateTime?
← →
Aristarh (2002-11-08 16:13) [25]>MMF © (08.11.02 16:06)
>по-твоему загрузит Интербэйс?
Нет не загрузит. Сейчас объясню. Это прога обзвона абонентов. Обзвон идет по определенным группам. Например, группа обзвона должников или группа информирования о тарифе. Один клиент может работать с одной группой, другой - с другой.
В твоем варианте каждому клиенту надо было бы иметь свой генератор, потому, что статистика работы ведется для каждой группы. Групп может быть произвольное кол-во, сл-но произвольное кол-во должно быть и генераторов.
← →
Wolf226 (2002-11-08 16:17) [26]Уточню, хранить в днях, а не в часах или секундах.
12 часов=0.5
Ну чтобы было как в Delphi и не надо было пересчитывать ничего.
← →
Wolf226 (2002-11-08 16:22) [27]Передавать как Double.
Потому что если передавать 2:00:00 как DateTime, то получишь 1.1.1900 2:00:00, если не ошибаюсь.
← →
Wolf226 (2002-11-08 16:25) [28]Кстати выполнить такой запрос не выйдет
update Statistics
set WorkTime = WorkTime + :Seconds
where ...
Не поддерживается сложение с параметром.
А вот если это же сделать в хранимой процедуре, то должно пройти.
← →
Aristarh (2002-11-08 16:26) [29]Всем спасибо.
← →
MMF (2002-11-08 16:30) [30]Ладно, забудем про генераторы. Тот же принцип, но в таблице
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
← →
MMF (2002-11-08 16:40) [31]Поправка Update TimeTable set TotalTime=TotalTime+1
where userID=:client_ID
Просто мне кажется лучше вести учет времени в условных единицах, и менять период обновления статистики на какой хочешь
← →
Aristarh (2002-11-08 16:43) [32]MMF, разве не проще хранить общее время в одном поле, а не создавать доп. таблиц.
>менять период обновления статистики на какой хочешь
Если использовать одно поле, то можно вообще не привязываться к периодам. Что передал в проц., на то и увеличилось время.
← →
MMF (2002-11-08 16:51) [33]Ну,я так понял, что тебе нужно разделять время по группам или по другим характеристикам клиентов, по которым потом делать отчеты. К тому же в таблице статистики можно сделать поле WorkDate default Now() чтобы хранить историю работы клиентов по суткам.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c