Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.28;
Скачать: CL | DM;

Вниз

Можно ли складывать 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.018 c
3-92874
Dbrf
2002-11-10 13:51
2002.11.28
Присвоение значения части даты


1-92988
бобёр
2002-11-18 18:14
2002.11.28
FileExecuteWait


6-93181
Дмитрий К.К.
2002-09-30 22:49
2002.11.28
Поиск файлов на FTP-серверах


14-93246
Николай Быков
2002-11-10 16:29
2002.11.28
....................


1-93080
Шишкин Илья
2002-11-16 15:49
2002.11.28
Как создать цикл?