|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Добрый день, имеется таблица Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Каждый день сотрудники при входе и выходе с работы отмечаются, в [Действие] пишется "Начало рабочего дня" и "Конец рабочего дня". Знаю есть DATEDIFF, но как определить время работы за один день, для определенного сотрудника знаю, но как составить таблицу со списком сотрудников и количеством отработанного времени за 1 день и за 1 неделю? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2021, 15:30 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Если у вас все аккуратно - в каждый день только два действия "Начало рабочего дня" и "Конец рабочего дня" причем "Начало рабочего дня" < "Конец рабочего дня" тогда в лоб Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Данный запрос будет правильно работать только на правильных данных. В случае бардака в данных он вернет херню ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2021, 21:45 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
SERG1257, Спасибо! Только мне надо было найти разницу во времени, т.е сколько сотрудник провел времени на роботе. Как быть если в [Действие] хранится не только начало и конец рабочего дня? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2021, 22:03 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
SERG1257, Спасибо! Только мне надо было найти разницу во времени, т.е сколько сотрудник провел времени на роботе. Как быть если в [Действие] хранится не только начало и конец рабочего дня? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2021, 22:06 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Kaktyc007, просто пример, отражающий последовательность действий для одного человека Принимаем, что есть обязательное 1-е событие "вход", потом, 2-е, соответственно, "выход" Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2021, 22:40 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Kaktyc007 Как быть если в [Действие] хранится не только начало и конец рабочего дня? Приведите пример, написав скрипты для заполнения данными таблицы [dbo].[УРВ] Что должен показать отчет в случае некорректных данных (Начал работу в 23:00 вечера, закончил в два ночи) Зашел на работу в 8:00 а выхода в 17:00 нет, следующая запись начало работы в 8 следующего дня И наоборот имеем несколько записей "Начало рабочего дня" в 8:00, 9:00 и 10:00 Или несколько записей "Конец рабочего дня" в 17:00, 18:00 и 19:00 Вы можете быть свято уверенны, что такого не будет, потому что нибудет никогда, но ответ - что должен показать отчет для таких данных должен быть приготовлен. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 02:20 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
SERG1257 Приведите пример, написав скрипты для заполнения данными таблицы [dbo].[УРВ] Код: sql 1. 2. 3.
SERG1257 Что должен показать отчет в случае некорректных данных (Начал работу в 23:00 вечера, закончил в два ночи) Зашел на работу в 8:00 а выхода в 17:00 нет, следующая запись начало работы в 8 следующего дня И наоборот имеем несколько записей "Начало рабочего дня" в 8:00, 9:00 и 10:00 Или несколько записей "Конец рабочего дня" в 17:00, 18:00 и 19:00 В первом случае 3 часа. А в остальных случаях не допускать этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 11:02 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Вот пример для вычисления длительности рабочего дня в минутах для одного сотрудника с одной записью в таблице, если добавить еще одно появления на работе, уже ругается: "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression." Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 11:18 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Kaktyc007 Вот пример для вычисления длительности рабочего дня в минутах для одного сотрудника с одной записью в таблице, если добавить еще одно появления на работе, уже ругается: "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression." Код: sql 1. 2.
Вот в чем проблема "настоящих программиздов"? Арифметику они не учили - вот в чем их проблема. 1. Если в табличке "все хорошо", т.е. каждому началу соответствует каждый конец 2. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
3. Если же там "не фсе хорошо" - надо сначала решить эту проблему... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 12:10 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
aleks222 Kaktyc007 Вот пример для вычисления длительности рабочего дня в минутах для одного сотрудника с одной записью в таблице, если добавить еще одно появления на работе, уже ругается: "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression." Код: sql 1. 2.
Вот в чем проблема "настоящих программиздов"? Арифметику они не учили - вот в чем их проблема. 1. Если в табличке "все хорошо", т.е. каждому началу соответствует каждый конец 2. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
3. Если же там "не фсе хорошо" - надо сначала решить эту проблему... Спасибо, но зачем брать текущее системное время? И как вывести отработанное время за неделю, а не за все время? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 12:18 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Kaktyc007 aleks222 пропущено... Вот в чем проблема "настоящих программиздов"? Арифметику они не учили - вот в чем их проблема. 1. Если в табличке "все хорошо", т.е. каждому началу соответствует каждый конец 2. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
3. Если же там "не фсе хорошо" - надо сначала решить эту проблему... Спасибо, но 1) зачем брать текущее системное время? И 2)как вывести отработанное время за неделю, а не за все время? 1. Ну... арифметика - полезная наука. Учи. 2. Ваще-то, оно выводит "за все время, что есть в таблице". Т.е. если в таблице оставить неделю - будет за неделю. "Оставить" = наложить нужный фильтр или добавить группировку по неделям. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 12:23 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
aleks222, а арифметика тут причем? если datediff находит разницу между записанным и текущим временем ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 13:03 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Kaktyc007 aleks222, а арифметика тут причем? если datediff находит разницу между записанным и текущим временем Если вычесть Разницу между "концом" и "текущим" из Разницы между "началом" и "текущим" - это и будет разница между "началом" и "концом". в-а = (1000+в) - (1000+а) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 13:45 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
godsql Kaktyc007 aleks222, а арифметика тут причем? если datediff находит разницу между записанным и текущим временем Если вычесть Разницу между "концом" и "текущим" из Разницы между "началом" и "текущим" - это и будет разница между "началом" и "концом". в-а = (1000+в) - (1000+а) почему нельзя сразу вычесть разницу между концом и началом? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 14:35 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Как объединить эти два запроса в один? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 15:06 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Kaktyc007 "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."правильно ругается. Выбирайте одно значение Kaktyc007 В первом случае 3 часа.То бишь эта ситуация вполне законна. Kaktyc007 А в остальных случаях не допускать этого. Про не допускать это триггеры и акты (отчет о кривых данных) Определяем бизнес правило - датой конца работы считается ближайшая дата от начала работы (в тот же или последующие дни) Предполагаем что кривых данных в таблице нет - мы выловили их ранее. Пишем подзапрос возвращающий ближайшую дату конца работы Код: sql 1. 2. 3. 4. 5.
обратите внимание на агрегатную функцию min - специально чтобы не было ошибки выше Также можно сделать top 1 Код: sql 1. 2. 3. 4. 5. 6.
У настоящих программистов появится соблазн засунуть этот подзапрос в скалярную функцию, не делайте этого - это убъет производительность Дальше фильтр по [dbo].[УРВ] на день или неделю, и сумму (в часах или минутах) разницы между d_start и d_end Код: sql 1. 2. 3. 4. 5.
Запрос специально неправильный (без подстановки d_start и d_end) чтобы служба медом не казалась ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 17:20 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
SERG1257 У настоящих программистов появится соблазн засунуть этот подзапрос в скалярную функцию, не делайте этого - это убъет производительность Настоящие программизды не пользуют подзапросы без крайней нужды. В данном, конкретном случае никаких подзапросов не надо. От слова совсем. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2021, 17:37 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Решение от алекса безусловно сильное, как и совет "арифметика - полезная наука. Учи." Я решил последовать совету, чтобы освежить свои знания арифметики. Очевидно, что в предложенном решении: 1. Для всех событий их ДатаВремя всегда будет предшествовать @now. 2. Точка 'Начало рабочего дня' будет находиться на оси времени левее точки 'Конец рабочего дня'. 3. От точки 'Начало рабочего дня' до точки @now пройдет больше времени, чем от точки 'Конец рабочего дня' до точки @now. Следовательно, значение -datediff(minute, ДатаВремя, @now) = -(@now - 'Начало рабочего дня') будет отрицательным и определять знак суммы. Т.е. запрос вернет отрицательное значение. Первой мыслью было взять @now меньше любого ДатаВремя, чтобы получить положительный результат! Но ведь дан хороший совет, проверь арифметикой! В этом случае 1. Для всех событий их ДатаВремя всегда будет позже @now. 2. Точка 'Начало рабочего дня' будет находиться на оси времени левее точки 'Конец рабочего дня'. 3. От точки @now до точки 'Конец рабочего дня' пройдет больше времени, чем от точки @now до точки 'Начало рабочего дня'. Теперь знак суммы будет определять выражение (@now - 'Конец рабочего дня'), которое так же будет отрицательным. Т.е. и в этом случае запрос вернет отрицательное значение. Здесь я вспомнил об абсолютном значении, но был же дан хороший совет! Можно просто изменить порядок дат в datediff, но еще проще поменять знаки в операторе case. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 13:57 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Wlr-l 1. Для всех событий их ДатаВремя всегда будет предшествовать @now. Это абсолютно пофиг. Можно использовать любую фиксированную точку на шкале времени. Арифметику ты тоже не доучил. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 17:50 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
aleks222 Wlr-l 1. Для всех событий их ДатаВремя всегда будет предшествовать @now. Это абсолютно пофиг. Можно использовать любую фиксированную точку на шкале времени. Арифметику ты тоже не доучил. 1. Так я сразу сказал, что благодаря твоему совету я решил вспомнить то, что недоучил в школе. 2. Действительно, можно использовать любую точку на шкале времени. У тебя она описана так: declare @now datetime = getdate(); 3. В твоем запросе получается, что если алекс пришел на работу в 08, а ушел в 10, то он проработал -2 часа. Далее, если часовая ставка 1 руб., то он заработал -2 рубля. Т.е. алекс, проработав в организации с 08 до 10, остался должен этой организации. 4. Я сказал, что твое решение сильное, по сравнению с другими предложенными решениями, и предложил его чуть-чуть подправить, чтобы время работы было положительным числом. 5. Кроме арифметики есть еще и логика. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 20:42 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Та система доступа, которую видел я, не позволит войти второй раз по одной и той же карточке. Как и два раза выйти. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2021, 03:26 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Wlr-l 3. В твоем запросе получается, что если алекс пришел на работу в 08, а ушел в 10, то он проработал -2 часа. Далее, если часовая ставка 1 руб., то он заработал -2 рубля. Т.е. алекс, проработав в организации с 08 до 10, остался должен этой организации. Не придирайся. Это минус из кармана работодателя. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2021, 06:00 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Да я и не придираюсь. Вспомнилась фраза классика МЛ: "Учиться арифметике настоящим образом". Вот я и учусь арифметике уже третий раз (сам, с дочкой, теперь с внучкой). Операция вычитания - это НЕ коммутативная операция . Собственно, как и сложение чисел с разными знаками. И эта не коммутативность может сыграть злую шутку. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2021, 12:02 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Wlr-l Собственно, как и сложение чисел с разными знаками. Сложение чисел с разными знаками (и вообще всех действительных чисел), таки, коммутативная операция. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2021, 12:24 |
|
Вычислить отработанное время
|
|||
---|---|---|---|
#18+
Да, это так, конечно, сложение чисел коммутативно. Я хотел сказать, что в рассматриваемом запросе имеет значение, где стоят унарные минус и плюс, хотя происходит суммирование разностей двух точек времени, которые (разности) в зависимости от выбранной опорной точки могут быть как положительными, так и отрицательными. Если они стоят так, как в оригинальном варианте, то мы получим отрицательное значение отработанного времени. Поменяв их местами, получим положительное значение отработанного времени. ТС, скорее всего, не понял красоту этого решения его задачи. Согласитесь, что для решения этой задачи абсолютное большинство использовало бы подзапросы: большая часть сообщений в этом обсуждении свелась к нахождению для каждого "начала" своего "конца"! Поэтому я скажу спасибо алексу за это его решение задачи ТС! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2021, 13:47 |
|
|
start [/forum/topic.php?fid=46&fpage=26&tid=1684760]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 306ms |
total: | 446ms |
0 / 0 |