Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.007 c
7-93265
alf_
2002-09-28 04:19
2002.11.28
Работа с мышкой


1-92972
[BAD]Angel
2002-11-18 13:42
2002.11.28
Как сделать?


14-93256
Snake2000
2002-11-07 12:32
2002.11.28
---|Ветка была без названия|---


1-92975
Holy
2002-11-18 10:47
2002.11.28
Графика


6-93173
kofman
2002-10-02 13:20
2002.11.28
Как добавит сой пункт в контекстное меню MSIE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский