這應該工作:
SELECT
username,
CONCAT(
FLOOR(
SUM(
UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time) - 86400 * (
(FLOOR(DATEDIFF(end_time, start_time)/7) * 2) +
IF(WEEKDAY(end_time) > 4, WEEKDAY(end_time) - 4, 0) +
IF(WEEKDAY(end_time) < WEEKDAY(start_time), 2, 0)
)
)/86400
),
' days ',
TIME_FORMAT(
SEC_TO_TIME(
SUM(
UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time) - 86400 * (
(FLOOR(DATEDIFF(end_time, start_time)/7) * 2) +
IF(WEEKDAY(end_time) > 4, WEEKDAY(end_time) - 4, 0) +
IF(WEEKDAY(end_time) < WEEKDAY(start_time), 2, 0)
)
) % 86400
),
'%H hours %i minutes'
)
) AS duration
FROM table
WHERE start_time > CONCAT(YEAR(CURDATE()) -1, '-12-31')
GROUP BY username;
,但它假定start_time
和end_time
週末期間從未下降。
查看http://sqlfiddle.com/#!2/d41d8/3587的工作示例。
如果你不關心一個額外的列,這個查詢可以簡化爲:
SELECT
@diff := SUM(
UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time) - 86400 * (
(FLOOR(DATEDIFF(end_time, start_time)/7) * 2) +
IF(WEEKDAY(end_time) > 4, WEEKDAY(end_time) - 4, 0) +
IF(WEEKDAY(end_time) < WEEKDAY(start_time), 2, 0)
)
) AS duration_seconds,
CONCAT(
FLOOR(@diff/86400),
' days ',
TIME_FORMAT(SEC_TO_TIME(@diff % 86400), '%H hours %i minutes')
) AS duration
FROM table
WHERE start_time > CONCAT(YEAR(CURDATE()) -1, '-12-31')
GROUP BY username;
有一些偉大的想法[這裏](http://stackoverflow.com/questions/2222563/mysql-calculate-the-difference-between-date-times-only-during-mf-work-week )。 –
定義「從結果中排除週末」。你的意思是從'duration'中減去週末時間,或者排除開始,結束或包含週末的記錄? –
他實際上想從持續時間中減去週末時間。 – Rahul