Не удалось найти вопросы, соответствующие моей. Если вы знаете, пожалуйста, дайте мне знать.Как суммировать зарегистрированные часы между двумя датами (не только общее количество часов между двумя датами)
Мне нужен оператор выбора, который показывает мне общее количество часов для сотрудника между датами.
Пример:
Сотрудник Dennis имел отсутствие от 2014-06-10 до 2014-06-13. У этого сотрудника были разные часы отсутствия между датами. Допустим, что Деннис уже отсутствовал так:
2014-06-10: 477 minutes
2014-06-11: 498 minutes
2014-06-12: 491 minutes
2014-06-13: 397 minutes
total absence: 1863 minutes
Я хочу, чтобы получить результат, как это:
У меня есть таблицы
EmployeeTime, которые имеют часы отсутствия в день.
AbsenseDays которые имеют от и до даты для отсутствия.
EmployeeTime будет выглядеть следующим образом:
| EmployeeName | Date | RegisteredHour |
и AbsenceDays будет выглядеть следующим образом:
| FromDate | TillDate | AbsenceId | KeyNo |
У меня есть третий стол LogTable, который может связать эти две таблицы вместе KeyNo и EmployeeID ,
Выход я получаю:
| EmployeeName | FromDate | TillDate | Days |Days without weekends | Date | RegisteredHour | Total min absence
| Dennis | 2014-06-10 | 2014-06-13 | 4 | 4 | 2014-06-10 | 477 | 9540
| Dennis | 2014-06-10 | 2014-06-13 | 4 | 4 | 2014-06-11 | 498 | 9960
| Dennis | 2014-06-10 | 2014-06-13 | 4 | 4 | 2014-06-12 | 491 | 9960
| Dennis | 2014-06-10 | 2014-06-13 | 4 | 4 | 2014-06-13 | 397 | 7940
| Joanne | 2014-05-09 | 2014-05-12 | 4 | 2 | 2014-05-09 | 420 | 2100
| Joanne | 2014-05-09 | 2014-05-12 | 4 | 2 | 2014-05-10 | 0 | 0
| Joanne | 2014-05-09 | 2014-05-12 | 4 | 2 | 2014-05-11 | 0 | 0
| Joanne | 2014-05-09 | 2014-05-12 | 4 | 2 | 2014-05-12 | 450 | 2250
Мне нужно, чтобы получить этот результат:
| EmployeeName | FromDate | TillDate | Days |Days without weekends | Total min absence
| Dennis | 2014-06-10 | 2014-06-13 | 4 | 4 | 1863
| Joanne | 2014-06-09 | 2014-06-12 | 4 | 2 | 870
Мой код:
SELECT DISTINCT
EmployeeTime.Name,
CONVERT(VARCHAR(10),FromDate,20) FromDate,
CONVERT(VARCHAR(10),Tilldate,20) Tilldate,
(DATEDIFF(DD, FromDate, Tilldate) +1) TotalDays,
(DATEDIFF(DD, FromDate, Tilldate) +1) - (DATEDIFF(wk, FromDate, Tilldate) * 2) DaysMinusWeekends,
CONVERT(VARCHAR(10),Dato,105) DateDato,
RegisteredHour,
SUM(RegisteredHour) Total
FROM EmployeeTime, AbsenceDays, LogTable
WHERE EmployeeTime.EmployeeId = LogTable.EmployeeId
AND LogTable.KeyNo = AbsenceDays.KeyNo
AND EmployeeTime.EmployeeId = 'D994'
AND (DATEDIFF(DD, FromDate, TillDate) +1) = 4
AND CONVERT(VARCHAR(10),FromDate,20) <= CONVERT(VARCHAR(10),Dato,20)
AND CONVERT(VARCHAR(10),TillDate,20) >= CONVERT(VARCHAR(10),Dato,20)
GROUP BY EmployeeTime.EmployeeId,FromDate, TillDate, Dato, RegisteredHour
ORDER BY EmployeeTime.EmployeeId
Примечание: Мне нужен ответ, где дон 'self-join tables или использовать WITH-запросы; SELECT должен быть первым в SQL, или программа не поймет его.
Я попытался сделать это более читаемым, но есть некоторые вещи, которые я не понимаю. Было бы полезно, если бы вы могли показать полное определение ('CREATE TABLE ...') для всех задействованных таблиц. Было бы также полезно, если бы вы могли уточнить, что вы подразумеваете под «Мне нужен ответ, где вы не присоединяетесь к таблицам» - SELECT, который вы показываете *, * присоединяется к таблицам, и ваша схема выглядит так, что это невозможно сделать без соединение. – zwol
Спасибо, что я вернулся завтра, поэтому я просто сделал быстрое редактирование! – marinadelademad