|
|
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Вот такой вопрос образовался: Имеется таблица REG_EVENTS, в которой содержатся события входа и выхода. Идентификатор человека, дата и время события и, последнее, тип события IDENTIFIER, DATE_EV, TIME_EV, AREAS_ID Первые три очевидны, последнее - если =1, то это выход, иначе вход. Требуется найти продолжительность присутствия для каждого случая, т.е. выход минус вход. В таблице идут строки последоватеьно: ВХОД-ВЫХОД-ВХОД-... Единственное, на что меня хватило, вот такой селект: select a.identifier, a.date_ev, min(time_ev), max(time_ev) from REG_EVENTS a group by a.IDENTIFIER, a.date_ev т.е. игнорируем промежуточные входы-выходы и в пределах одного дня всё замечательно. Но желательно и промежуточные посчитать, но самое главное, вход может быть сегодня, а выход завтра, и вот тут группировка по дате не прокатывает. В фоксе подобное решается перебором строк, а вот как это сделать SQL-запросом, тут я не знаю. Посоветуйте, в какую сторону копать? С уважением, Сергей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:05:56 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
sss71, в сторону процедур, конечно же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:23:28 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
sss71DATE_EV, TIME_EV Кто такое придумал? Почему не timestamp? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:24:11 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
sss71, Я бы добавил поле "длительность" и вычислял его в триггере при заполнении поля "время выхода", а в запросах суммировал бы длительность. Правда, если есть варианты типа "зашел сегодня, а вышел через год" и посчитать надо только то, что сегодня, прямое суммирование не проканает. А еще бы учесть, что можно (ошибочно) зайти сегодня, а выйти послезавтра и тогда надо думать, как вычислить (и надо ли) завтра. Это все я к тому, что маловато входных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:28:11 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
miwaonline, Тьфутыблин, показалось, что вход и выход содержатся в одной записи. Но все равно, одним селектом такое разве что Таблоид сделает, если у него будет «час і натхнення»© (время и вдохновение). :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:31:06 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
miwaonlineНо все равно, одним селектом Как он осилит, когда один зашел, а вышли - два? А десять? У нас на всех дверях и по одному пропуску может хоть цех выйти. И только на проходной стоит крутилка и только там каждый проходит отдельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:34:37 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
И то, все эти крутилки имеют вероятность глюкнуть, сломаться. Надо сразу закладываться на то, что будут встречаться "рваные" данные. Если у вас нет круглосуточных фахт, я бы посоветовал при отсутствии факта ухода/прихода принудительно ставить время ухода/прихода полуночью (либо официальным временем окончания/начала рабочего дня). Ну и заодно добавить признак, что это время не соответствует реальности (для отчета о багах и в конфликтных ситуациях). соответственно при такой логике одним запросом не обойтись. Ну а с ХП можно и перебор сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:18:02 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
wadmansss71DATE_EV, TIME_EV Кто такое придумал? Почему не timestamp? Согласен. Из стартпоста не понятно какая СУБД, но я начал бы с того, что объеденил два поля DATE_EV, TIME_EV в одно DATE_TIME_EV. в итоге получаем следующее: IDENTIFIER, DATE_TIME_EV, AREAS_ID Не претендую на самый быстрый вариант. И одним select тут не обойтись. если вложенные select в вашей СУБД прокатят, то ход мыслей следующий: сканируем дважды таблицу для входов (A) и для выходов (B). select A.IDENTIFIER, A.DATE_TIME_EV as TIME_A, B.DATE_TIME_EV as TIME_B from (select IDENTIFIER, DATE_TIME_EV where AREAS_ID != 1) A, -- входы (select IDENTIFIER, DATE_TIME_EV where AREAS_ID = 1) B -- выходы where (A.IDENTIFIER = B.IDENTIFIER) and (B.DATE_TIME_EV > A.DATE_TIME_EV) -- в этом месте отбираем только те выходы, которые были после входа group by A.IDENTIFIER having (B.DATE_TIME_EV - A.DATE_TIME_EV) = MIN (B.DATE_TIME_EV - A.DATE_TIME_EV) -- в этом месте отбираем те выходы, которые со входом имеют минимальную разницу во времени. на движке не проверял. Может, рабочий запрос будет выглядеть немного по-другому. Но общая идея такова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:28:11 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
так лучше будет: select A.IDENTIFIER, A.DATE_TIME_EV as TIME_A, MIN(B.DATE_TIME_EV) as TIME_B -- в этом месте отбираем те выходы, которые следуют сразу после входа. from (select IDENTIFIER, DATE_TIME_EV where AREAS_ID != 1) A, -- входы (select IDENTIFIER, DATE_TIME_EV where AREAS_ID = 1) B -- выходы where (A.IDENTIFIER = B.IDENTIFIER) and (B.DATE_TIME_EV > A.DATE_TIME_EV) -- в этом месте отбираем только те выходы, которые были после входа group by A.IDENTIFIER, A.DATE_TIME_EV даже заработать сразу должен, после того как DATE_EV, TIME_EV будут объедены в одно поле DATE_TIME_EV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:55:03 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
Fr0sT-BrutalИ то, все эти крутилки имеют вероятность глюкнуть, сломаться. Надо сразу закладываться на то, что будут встречаться "рваные" данные. Если у вас нет круглосуточных фахт, я бы посоветовал при отсутствии факта ухода/прихода принудительно ставить время ухода/прихода полуночью (либо официальным временем окончания/начала рабочего дня). Ну и заодно добавить признак, что это время не соответствует реальности (для отчета о багах и в конфликтных ситуациях). соответственно при такой логике одним запросом не обойтись. Ну а с ХП можно и перебор сделать Предлагаю рассмотреть пример. рабочий день с 9:00 до 18:00 перерыв с 13:00 до 14:00 1. Законопослушный вариант: вход 8:55 выход 13:05 вход 13:55 выход 18:05 Итог: первый вх-вых (4:10) + второй вх-вых (4:10) = 8:20 время в офисе 2. Вариант, в котором сотрудник "забыл" отметить выход на перерыв: вход 8:55 выход: отсутствует вход 13:55 выход 18:05 Итог: первый вх-вых (9:10) + второй вх-вых (4:10) = 13:20 (!) время в офисе при 8-ми часовом дне поэтому, при отсутствующих данных два входа или два выхода подряд нужно принимать решение, что с этим делать. возможно, ввести "презумпцию виновности": если входа подряд, то первый вход не учитывать. Учитывать только второй. тогда у "забывчивых" сотрудников будет стимул не забывать отмечаться: Итог для "забывчивых": первый вх-вых (0:00) + второй вх-вых (4:10) = 4:10 тогда это будет правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 12:15:55 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
Некоторое время интернет не работал, потому отвечу всем в одном письме: 1. База существует как есть и заполняется не мной. Никаких полей я туда добавлять не могу. Я лишь хочу получать выборки из неё, отличные от стандартного функционала. 2. Ходить всем по одному пропуску не дадут суровые дяди, варианты с двумя входами и одним выходом исходной программой предусмотрены и соответственно помечаются. Я не стал на них заострять внимание, т.к. сам отфильтрую без проблем. Варианты с отключением света и т.п. тоже имеются в виду. Они у меня тупо записаны на бумажку, и при анализе выборки учитывается, что такому-то числу верить нельзя. 3. Процедурами не владею, но 4. вот идея с двумя селектами из одной таблицы в качестве источников мне понравилась. Буду копать в эту сторону. Спасибо всем ответившим! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 14:38:40 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
СУБД - Firbird SQL 2.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 14:43:02 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
sss71СУБД - Firbird SQL 2.5 Эх, а я только собрался посоветовать функцию LAG()... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 14:50:05 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
sss71желательно и промежуточные посчитать, но самое главное, вход может быть сегодня, а выход завтра DDL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Выборку с учетом пользователей сделаете сами. ЗЫ. Через процедуру будет быстрее, т.к. таблица будет пройдена только один раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 17:18:38 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
В трёшке с оконными ф-циями всё проще и короче: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Но для поиска следующей строки в порядке возрастания даты не задействован индекс t_dts_idx, как того хотелось бы. Поэтому что там будет на большом числе строк - еще вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 17:31:33 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
miwaonlinemiwaonline, Но все равно, одним селектом такое разве что Таблоид сделает, если у него будет «час і натхнення»© (время и вдохновение). :) wadmanmiwaonlineНо все равно, одним селектом Как он осилит, когда один зашел, а вышли - два? А десять? Таблоид Query: (не сгруппированный; null в графе `was_here` означает ошибку в этом дне) Выборку с учетом пользователей сделаете сами. ЗЫ. Через процедуру будет быстрее, т.к. таблица будет пройдена только один раз. Я знал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 17:33:46 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
miwaonlineЯ знал а что тут сложного ?.. %-) Смотрим, "что там дальше записано было", и применяем простые проверки. ТС, возможно, еще что-то там недоговорил про их труд и быт, но это уже пусть сам дорёшивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 17:36:44 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
Таблоид Код: plaintext Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 18:10:52 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
sss71Здравствуйте! Идентификатор человека, дата и время события и, последнее, тип события IDENTIFIER, DATE_EV, TIME_EV, AREAS_ID Первые три очевидны, последнее - если =1, то это выход, иначе вход. С уважением, Сергей. А если сервер или программа упадет как отследишь? Выход некуда/некому записать. Может лучше каждые х секунд еще и говорить работает. 1 - вошел 2 - работает т.к х секунд оповещают 3 - вышел 4 - аварийный выход (это состояние тоже отслеживается) к примеру у меня более 2 минут нет сообщений значит отвалился. А дальше, тут варианты предлагали, зашел и не вышел до завтра. Это тоже решается. Есть функции видовые "Простаивает ОС". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 18:31:17 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
Я для себя этот вопрос решил, хранением в одной строке и времени входа и выхода. На "сессию" получается ID и с этим пишется время входа, и при выходе - выхода. А чтобы, при каком-то сбое время выхода не осталось незаполненным, оно каждые несколько минут (и сразу при входе) заполняется текущим TIMESTAMP и признаком "автоматической" записи. А когда реально юзер выходит, ставится время выхода, и снимается флаг "автозаписи". Зато считается всё потом элементарным запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 18:41:59 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
ТаблоидВ трёшке с оконными ф-циями всё проще и короче:<...> Но для поиска следующей строки в порядке возрастания даты не задействован индекс t_dts_idx, как того хотелось бы. Поэтому что там будет на большом числе строк - еще вопрос .Уже нет вопроса. По кр мере, для таблицы с 15 лямами строк, в которую добавлялись случайные int-числа: sample Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 18:46:51 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
Kotъ-BegemotъЯ для себя этот вопрос решил, хранением в одной строке и времени входа и выхода. На "сессию" получается ID и с этим пишется время входа, и при выходе - выхода. А чтобы, при каком-то сбое время выхода не осталось незаполненным, оно каждые несколько минут (и сразу при входе) заполняется текущим TIMESTAMP и признаком "автоматической" записи. А когда реально юзер выходит, ставится время выхода, и снимается флаг "автозаписи". Зато считается всё потом элементарным запросом. Мне нравится! Неплохой выход из ситуации. Дешиво и сердито. А разгильдяйство человеческого фактора можно потом логикой победить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 18:53:54 |
|
||
|
Посчитать время присутствия по паре строк ВХОД и ВЫХОД
|
|||
|---|---|---|---|
|
#18+
Насчет входа и выхода в одной строке - не потянет. Если даже не считать того, что система уже построена и написана, то вход может быть в одно место, а выход из другого, или вход во внешние ворота, потом вход во внутренние. Тот самый признак areas_id = 1 на самом деле означает 1 - внешняя территория, а внутренних может быть много. Поэтому 1 - выход, а <>1 - вход, неважно куда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2013, 07:57:50 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38481204&tid=1564103]: |
0ms |
get settings: |
4ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
197ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 490ms |

| 0 / 0 |
