• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Лишние записи

  • Автор темы Jas
  • Дата начала
Статус
Закрыто для дальнейших ответов.
J

Jas

Есть БД состояшая из 2 таблиц:
1. Люди
2. События
В таблице люди есть ФИО и код человека
В таблице События есть поля: Код человека, Дата события, Время события, тип события (вход или выход).
Ситуация такая. Нужно посчитать какое время человек находился в помешении, для этого я делаю следующее:
1. Создаю запрос в котором выбираю все записи где тип события=вход
2. Создаю запрос в котором выбираю все записи где тип события=выход
3. Создаю запрос в котором из двух предыдуших запросво путем простого вычетания получаю время пребывания, но вот тут то и начинаеться интересные веши.
Если человек просто зашел и вышел то все нормально, но стоит человеку зайти и выйти (тоесть вход1 выход1; вход2 выход2) как взапросе получаеться следующее:
Вход1-выход2
вход2-выход1
вход2-выход2
вход1-выход1
Как можно победить эту ситуацию? Чтобы в результате остались только Вход1-выход1 и вход2-выход2
 
B

Barmutik

Здаётся мне что мы точно такую ситуацию с запросами про время нахождения сотрудников уже обсуждали и даже запросы человеку писали...

Стоит воспользоваться поиском...
 
J

Jas

Здаёться мне что я и есть тот самый человек которому Вы все это писали, но именно по этой проблеме я не задавал вопрсов, потомучто сталкнулся с ней не так давно.
 
E

European

Прошлого обсуждения не помню, но выскажу свое мнение.
Простейший способ - добавить еще одно поле с номерором события вход-выход. Можно также попытаться не выбирать для событий входа событий выхода с меньшим временем, но при этом возможны глюки при входе-выходе более 2-х раз. Получается довольно сложный запрос, который так с ходу и не напишешь. Я бы задумался над переносом логики в хранимую процедуру - там возможностей-то побольше

P.S. Если кто найдет, то дайте ссылку на прошлое обсуждение
 
?

????

а что будет если человек вошел 2 раза а вышел 1? 10 раз входил и вообще не выходил? У нас такое часто бывает когда что-то носим через КПП и заняты руки - вертушка открывается охранником.

У нас покупная система, но как я понял, там для каждого события заводиться идентификатор. Человек вошел - получил ID 1. Вышел - в строчку с ID 1 записали время выхода. Человек вошел ещё раз - получил ID 2. Не выходя вошел ещё раз - в строчку с ID 2 записали текущее время и создали ещё одну ID 3. и т.д. Если человек не входил, а просто выходит - заводится ID X с временем входа=времени выхода.

Попробуй сделать примерно так.
 
B

Barmutik

Я думаю что у человека просто готовая прога данные пишет в таком виде в БД...

А применять хранимую процедуру как раз и есть хорошее решение...
 
J

Jas

Вся проблема в том что у нас система тоже покупная, и я не могу тама ниче изменять, поэтому все что я могу сделать, это читать файл БД который выгружаеться из основоной проги.
 
E

European

<!--QuoteBegin-Jas+23:01:2007, 12:04 -->
<span class="vbquote">(Jas @ 23:01:2007, 12:04 )</span><!--QuoteEBegin-->поэтому все что я могу сделать, это читать файл БД который выгружаеться из основоной проги.
[snapback]53858" rel="nofollow" target="_blank[/snapback]​
[/quote]
Это что с DBF-ом работа?
 
E

European

Какими средствами с файлом работаешь?
 
E

European

Пусть есть таблица события с полями: человек, время, тип (вход или выход). Если сходу написать в псевдо-SQL, то что то типа того:
Код:
select вх.человек, вх.время, вых.время, min( вых.время - вх.время )
from
(
select человек, время
from события 
where тип = вход
) вх
left join
from
(
select человек, время
from события 
where тип = выход
) вых on вх.человек = вых.человек
where вых.время > вх.время
group by вх.человек, вх.время, вых.время
Если заработает, то дату прикрутишь сам
 
J

Jas

делаю все чисто с запосами в аксессе

Малость поздновато заглянул суда. Я сделал по следующему алгоритму:
Создал запрос в котором все кто вошел группируються и суммируються. Тоже для всех кто вышел. Таким образом получил в 3 запросе сумма всего времени выходяшего-сумма всего времени входяшего.
European спасибо за содействие, Ваш алгоритм решения тоже буду иметь ввиду.
 
E

European

<!--QuoteBegin-Jas+23:01:2007, 16:44 -->
<span class="vbquote">(Jas @ 23:01:2007, 16:44 )</span><!--QuoteEBegin-->получил в 3 запросе сумма всего времени выходяшего-сумма всего времени входяшего.
[snapback]53872" rel="nofollow" target="_blank[/snapback]​
[/quote]
Так надо же было сразу сказать, что интересует общее время, а не отдельно по каждому человеку
 
J

Jas

Так надо же было сразу сказать, что интересует общее время, а не отдельно по каждому человеку
Я получил таким образом время именно для каждого человека.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!