В этой задаче есть два вида записей
:
запись, в которых [время_запуск] и [конечный момент] находятся в том же месяце, и
запись, в которых они не являются.
Расчет истекшего времени для первого случая легко:
SELECT
Staff,
Month([StartTime]) AS WorkMonth,
DateDiff("n", [StartTime], [EndTime]) AS MinutesWorked
FROM WorkLog
WHERE Month([EndTime])=Month([StartTime])
Расчета истекшего времени для записей, которые охватывают в месяц границу процесс состоит из двух частей:
(я) Получить истекшее время ранее месяца
SELECT
Staff,
Month([StartTime]) AS WorkMonth,
DateDiff("n", [StartTime], DateSerial(Year([StartTime]), Month([StartTime]) + 1, 1)) AS MinutesWorked
FROM WorkLog
WHERE Month([EndTime])>Month([StartTime])
(б) Получить истекшее время для followi нг месяца
SELECT
Staff,
Month([EndTime]) AS WorkMonth,
DateDiff("n", DateSerial(Year([EndTime]), Month([EndTime]), 1), [EndTime]) AS MinutesWorked
FROM WorkLog
WHERE Month([EndTime])>Month([StartTime])
Таким образом, чтобы получить итоговые мы просто UNION ALL три запросы и завернуть их в запросе агрегации для выполнения SUM()
SELECT WorkMonth, Staff, SUM(MinutesWorked) AS TotalMinutes
FROM
(
SELECT
Staff,
Month([StartTime]) AS WorkMonth,
DateDiff("n", [StartTime], [EndTime]) AS MinutesWorked
FROM WorkLog
WHERE Month([EndTime])=Month([StartTime])
UNION ALL
SELECT
Staff,
Month([StartTime]) AS WorkMonth,
DateDiff("n", [StartTime], DateSerial(Year([StartTime]), Month([StartTime]) + 1, 1)) AS MinutesWorked
FROM WorkLog
WHERE Month([EndTime])>Month([StartTime])
UNION ALL
SELECT
Staff,
Month([EndTime]) AS WorkMonth,
DateDiff("n", DateSerial(Year([EndTime]), Month([EndTime]), 1), [EndTime]) AS MinutesWorked
FROM WorkLog
WHERE Month([EndTime])>Month([StartTime])
)
GROUP BY WorkMonth, Staff
, который будет возвращать ...
WorkMonth Staff TotalMinutes
--------- ----- ------------
3 B 210
4 B 225
... и вы можете добавить функции Format()
, если вы хотите настроить форматирование месяца (например, как текст) или общее время (например, как «hh: nn»).
+1 Потому что использование SQL всегда предпочтительнее, чем просмотр наборов записей. – Clon
Большое вам спасибо.Это прекрасно решает мою проблему. – user2515536