|
|
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
Возникла задача подсчитать (примерно, с точностью до десятков минут) сколько времени проводят сотрудники на рабочем месте. Все исходные данные, которые можно накопать, выглядят примерно так. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Тоесть есть только идентификаторы операторов и моменты времени, когда они были на рабочем месте. По данных с примера считаем, что оператор1 был на рабочем месте с 9:00:00 по 9:26:00 и потом с 10:01:01 по 10:03:15, оператор2 - с 9:31:18 по 9:55:55 и т.д. В оконцовке нужен примерно такой результат: Оператор1 - 28 минут (допускается с 27 по 30 в засомости от округления секунд). Оператор2 - 34-36 минут. Оператор3 - 5-7 минут. Конечная конструкция будет в execute block-е, так что одним запросом и оконными функциями тройки обходиться не обязательно :) Сам я выкрутился следующим образом Код: sql 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. Интересует, есть ли менее дуболомные варианты решения такой задачи при заданных исходных условиях (тоесть столбца "длительность" нету и пройтись простым суммированием по нему, соответственно, не получится). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:25:23 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonline, А в секундах достаточно будет? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:38:07 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
DarkMaster, .... а id самих операторов - через DISTINCT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:39:31 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
а Оператор1 - 28 минут, потому что был Оператор2, а если бы его не было, то было бы 63 минуты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:41:47 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
pizmonа Оператор1 - 28 минут, потому что был Оператор2, а если бы его не было, то было бы 63 минуты? Да. Тоесть, операторы могут работать повторно в течении суток и период их отсутствия не должен быть защитан как рабочее время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:43:32 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
INSERT INTO TEST1 (OPERATOR_ID, PROCESS_TIME) VALUES (1, '9:26:00'); INSERT INTO TEST1 (OPERATOR_ID, PROCESS_TIME) VALUES (2, '9:31:18'); Оператор1 ретировался ровно в 9.26, а второй явился строго в 9.31? Как-то не совсем честно, по отношению к операторам. Поделить интервал и раздать в некой пропорции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:44:29 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonline, А, блин, недочитал - извини... Тут еще надо периоды работал/неработал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:44:31 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
Я бы лично предпочел gtt вместо контекстных переменных, гарантированно хватит места под любое кол-во операторов, хотя судя по вводным и переменных хватает с запасом, но тем не менее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:48:21 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlineИнтересует, есть ли менее дуболомные варианты решения такой задачи при заданных исходных условиях (тоесть столбца "длительность" нету и пройтись простым суммированием по нему, соответственно, не получится). Написать процедуру которая будет возвращать "длительность", и уже потом суммировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:49:08 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
Ivan_PisarevskyINSERT INTO TEST1 (OPERATOR_ID, PROCESS_TIME) VALUES (1, '9:26:00'); INSERT INTO TEST1 (OPERATOR_ID, PROCESS_TIME) VALUES (2, '9:31:18'); Оператор1 ретировался ровно в 9.26, а второй явился строго в 9.31? Как-то не совсем честно, по отношению к операторам. Поделить интервал и раздать в некой пропорции? Если делать по-честному, тогда - да. Но сейчас я даже "нечестно" не очень хорошо это делаю. Насчет gtt - согласен; нефиг мне контекстными переменными разбрасываться :) m7m, А откуда процедура возьмет длительности, если их нету; есть только моменты времени когда сканировалась карточка оператора, и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 13:58:11 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlineА откуда процедура возьмет длительности, если их нетуприджойнить саму на себя по критерию дата больше текущей, правда это больше напоминает sql-ex а не работающее решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 14:00:07 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
Ivan_PisarevskymiwaonlineА откуда процедура возьмет длительности, если их нетуприджойнить саму на себя по критерию дата больше текущей, правда это больше напоминает sql-ex а не работающее решение. И опять же промежутки между двумя операторами потеряются, если я тебя правильно понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 14:02:40 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlineне очень хорошо это делаю.алгоритмически код довольно тривиальный, идешь по своему запросу(ты его уже привел), пока не сменится оператор, как сменился, то "update or insert into gtt" если его еще нет в гтт, то пишем, если есть, если есть, то увеличиваем его счетчик. потом простой селект из гтт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 14:03:08 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlineпромежутки между двумя операторами потеряютсясмотря как джойнить. хотя мне кажется алгоритмический код здесь будет быстрее и более понятным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 14:05:09 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlineСам я выкрутился следующим образом А что если так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Будет нормально отработана ситуация когда оператор ещё сидит на месте. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 14:09:15 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlinem7m, А откуда процедура возьмет длительности, если их нету; есть только моменты времени когда сканировалась карточка оператора, и все. а в чем проблема-то??? читаем последовательно отсортированный по PROCESS_TIME набор данных и считаем длительность, не забывая обрабатывать смену OPERATOR_ID и конец набора данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 14:10:08 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
"скучно без водки" (С) (в смысле, без оконных функций :)). Можно так попробовать: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. NB: из-за отсутствия ДАТЫ в поле времени будут проблемы при переходе через полночь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 14:29:25 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, отвлекли. Dimitry Sibiryakov, В твоем примере из-за order by 1, 2 будут некорректные значения в случае, когда оператор работал несколько раз с перерывами. m7mmiwaonlinem7m, А откуда процедура возьмет длительности, если их нету; есть только моменты времени когда сканировалась карточка оператора, и все. а в чем проблема-то??? читаем последовательно отсортированный по PROCESS_TIME набор данных и считаем длительность, не забывая обрабатывать смену OPERATOR_ID и конец набора данных Я имел в виду, что изначально нету данных по длительности, есть только некоротые контрольные точки, которые гарантировано указывают наличие карты перед сканером, но сколько времени перед считыванием и после него оператор провел на рабочем месте - неизвестно. С учетом вышесказанного с остальным - согласен. Таблоид, Ну вот как ты это делаешь? Мало того, что нифига не понятно, оно еще как-то работает. Я теперь пол-вечера буду пытаться понять - как именно %) Дата, само собой, в реальных данных есть, но переходы через полночь не нужны - работа заканчивается не позже 20 часов. В целом - спасибо всем откликнувшимся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 20:20:52 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlineВ твоем примере из-за order by 1, 2 будут некорректные значения в случае, когда оператор работал несколько раз с перерывами. Не будут. Все периоды работы сложатся, перерывы из них вычтутся. Проверь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 20:23:14 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Само собой, я сейчас проверю и твой пример и Таблоида, только сначала пойму, как они работают :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 20:27:53 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovmiwaonlineВ твоем примере из-за order by 1, 2 будут некорректные значения в случае, когда оператор работал несколько раз с перерывами. Не будут. Все периоды работы сложатся, перерывы из них вычтутся. Проверь. А-а-а-а, aaa = -aaa; Понятно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 20:32:27 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlineПонятно Пардон, моё решение таки неправильное. Я неверно понял задачу: думал, что датчик стоит на входе и в таблице приведены времена приходов и уходов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 20:52:47 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
miwaonlineЕсли делать по-честному, тогда - да. Я сейчас скажу бред, но чем-то мне эта табличка напоминает метод Монте-Карло. Если записей за день в ней достаточное количество, то периоды работы получаются как общий промежуток, поделённый на всех в пропорциях их count-ов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 20:58:48 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
Таблоид"скучно без водки" (С) (в смысле, без оконных функций :))да, невмоготу что-то стало... Миша, открывай трёшку, ей-богу!.. :-)) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Result:OP_IDSUM_SECONDS11694214773365 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 23:44:06 |
|
||
|
Как вычислить длительность работы по временным отметкам
|
|||
|---|---|---|---|
|
#18+
ТаблоидТаблоид"скучно без водки" (С) (в смысле, без оконных функций :))да, невмоготу что-то стало... Миша, открывай трёшку, ей-богу!.. :-)) Да открыл, открыл. Ну, как минимум поставил снапшот :) Еще когда вы с Денисом пару недель назад говорили, что тестировать ее надо всем сообществом. Что-то конкретное по оконным функциям можешь посоветовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2014, 10:37:32 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38576852&tid=1563833]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 344ms |

| 0 / 0 |
