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

Тема в разделе "Остальные БД", создана пользователем Jas, 22 янв 2007.

Статус темы:
Закрыта.
  1. Jas

    Jas Гость

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

    Barmutik Гость

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

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

    Jas Гость

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

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

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

    ???? Гость

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

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

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

    Barmutik Гость

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

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

    Jas Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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-ом работа?
     
  9. Jas

    Jas Гость

    нет обычный аксесовский mdbшник
     
  10. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Какими средствами с файлом работаешь?
     
  11. European

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

    Jas Гость

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

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Так надо же было сразу сказать, что интересует общее время, а не отдельно по каждому человеку
     
  14. Jas

    Jas Гость

    Я получил таким образом время именно для каждого человека.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей