Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 19:35 13.06.24 
Компютри и Интернет
   >> Бази данни
*Кратък преглед

Тема намиране на максимален брой при datetime колони  
Автор MyXa (Lifche)
Публикувано04.02.04 13:44



здравейте.
в таблица имам записи за сесиите на потребители, част от полетата в която са:

SessionID, LoginTime, LogoutTime

искам да намеря колко максимален брой потребители е имало логнати по едно и също време.

опитах нещо като:

SELECT COUNT(*) FROM Expired AS A, Expired AS B WHERE A.LoginTime >= B.LoginTime AND A.LogoutTime <= B.LogoutTime AND A.SessionID != B.SessionID;

т.е., опитах се да намеря сесии които са в един период от време, но не става, не се получава това което очаквам. А не мога да го измисля, как да задам ограничението сесиите да се засичат откъм време.

Примерно User1 е влязъл на 29.01.2004 15:00:00 и е излязъл на 29.01.2004 15:35:45, а User2 е влязъл на 29.01.2004 15:04:00 и е излязъл на 29.01.2004 16:23:00;

В този случай е имало 2-ма потребители по едно и също време. Е на това нещо искам да му намеря максималният брой.

благодаря :)

Редактирано от MyXa на 04.02.04 14:41.



Тема Re: намиране на максимален брой при datetime колонинови [re: MyXa]  
Автор NikB (любопитен)
Публикувано04.02.04 14:15



На първо четене се сещам за един "бабешки" алгоритъм:
Правиш си един SQL, така че двете полета за време да са съвместени в едно поле (по което да се sort i where) и да има поле, по което да се познава дали е ин или оут (може би Calculated). Сортираш по датата, селектираш по период, и обхождаш: когато е ин- увеличаваш един брояч, проверяваш за мах и ако е мах - запомняш времето; когато е оут - намаляваш брояча.
Ако за общия период, за който търсиш подпериод с максимум имаш 10-20 000 логвания - бива.
Ама май е по-хубаво да си добавиш едно поле в таблицата и там текущо да си пишеш колко маймуни има на клона.



Тема Re: намиране на максимален брой при datetime колоннови [re: NikB]  
Автор MyXa (Lifche)
Публикувано04.02.04 14:48



Можеш ли да го напишеш на SQL, ако не ти е проблем да се занимаваш, така не съм сигурен че разбрах.

За другата таблица, мислих, имам такава в която записвам броя на текущо online потребителите.

Мога да направя така:
1. Login на usera
2. UPDATE OnlineUsers SET Online = Online + 1;
3. UPDATE OnlineUsers SET МахOnline = Online WHERE МахOnline < Online;

Но така увеличавам SQL-ите с 1 на всяко логване, докато тази статистика която искам ще се изпълнява сравнително рядко.



Тема Re: намиране на максимален брой при datetime колоннови [re: MyXa]  
Автор NDeu (динозавър)
Публикувано04.02.04 16:02



Пробвай нещо от вида:

select first 1 t1.SESSIONID ,count(*) as c

from EXPIRED t1, EXPIRED t2
where t2.LOGINTIME between t1.LOGINTIME and t1.LOGOUTTIME
or t2.LOGOUTTIME between t1.LOGINTIME and t1.LOGOUTTIME
Group by t1.SESSIONID
Order by 2 desc




Тема Re: намиране на максимален брой при datetime колоннови [re: NDeu]  
Авторбaй Любo (Нерегистриран)
Публикувано04.02.04 19:24



Същото като предложението на Тдеу по-горе. Поствам го само щото вече съм го написал. Синтаксиса е Т-SQL (sybase and ms sql server):

declare @v4ra datetime, @dnes datetime
select @v4era='Feb 3, 2004'
select @dnes ='Feb 4, 2004'

select a.LoginTime, count(b.*)
from <kak ti se kazwa tablicata> a
,<kak ti se kazwa tablicata> b

where
/* parvire dwe klausi ograni4awat rezultata */
/* da otraziawa samo v4erashnite logins i ne sa vajni */
a.LoginTime >=@v4era
and a.LoginTime < @dnes
/* E tova e vajniq stuff: */
/* zna4i za wseki moment w koito imame login */
/* broime sesiite deto sa se lognali predi tozi moment */
/* i sa se lognali off sled tozi moment */
/* Parviq red w rezultata pokazwa maksimuma */
/* Ako ti trqbwa samo toj, sloji edno */
/* set rowcount 1 predi toia select */
and a.LoginTime >= b.LoginTime
and a.LoginTime <= b.LogoutTime
group by a.LoginTime
order by 2 desc

абе на второ четене май не е същото -- тоя ОР в примера на Тдеу не го разбирам що е.



Тема Re: намиране на максимален брой при datetime колоннови [re: бaй Любo]  
Автор NDeu (динозавър)
Публикувано04.02.04 21:29



Абе и аз като го гледам на второ четене видях, че не е каквото трябва. Сещам се как да стане със съхранена процедура и като компенсация ще я напиша сега даже да вади и диаграма:



CREATE PROCEDURE SP_CONNECTIONS (
/*START_INTERVAL и END_INTERVAL - интервала за който вадим диаграмата*/
START_INTERVAL TIMESTAMP,
END_INTERVAL TIMESTAMP)
RETURNS (
/*FROMTM и TOTM - интервалче в границите на което има конект/дисконект*/
/*CONNECTIONS - брой сесии в интервалчето*/
/*Ако пуснеш select MAX(CONNECTIONS) from SP_CONNECTIONS (:V4ERA,DNESKA)*/
/*ще намериш каквото ти трябва*/
FROMTM TIMESTAMP,
TOTM TIMESTAMP,
CONNECTIONS INTEGER)
AS
begin
FROMTM=:START_INTERVAL;
for
select e1.LOGINTIME as TM
from expired e1
where e1.logintime between :START_INTERVAL and :END_INTERVAL
union
select e2.LOGOUTTIME as TM
from expired e2
where e2.logouttime between :START_INTERVAL and :END_INTERVAL
order by 1
into :TOTM
do begin
select count(*)
from expired
where :FROMTM between LOGINTIME and LOGOUTTIME
and :TOTM between LOGINTIME and LOGOUTTIME
into :CONNECTIONS;
suspend;
FROMTM=:TOTM;
end
end




Тема Re: намиране на максимален брой при datetime колоннови [re: NDeu]  
Автор MyXa (Lifche)
Публикувано05.02.04 17:49



Това изглежда много яко. За съжаление няма да мога да го пробвам, работя с MySQL.

Благодаря за отговорите, тествах изразите, получава се, с някои забележки, но доста се бави при повече редове, логично което е.
В крайна сметка избрах варианта с отделното поле в таблица, като успях да го направя да се update-ва само ако наистина има нужда, което ме устройва.




*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.