您正在为每一行考虑end_date。您需要检查end_date是否大于您正在检查的日期的结束日期。
目前我无法尝试,但伪工作 mysql 可能如下所示:
SELECT Sum(
Timestampdiff(minute, start, LEAST(end_date, '2016-08-24 23:59:59'))
) AS shift_mins
FROM
`student_shift_history`
WHERE student_id = 9652
AND `start` BETWEEN '2016-08-24 00:00:01' AND '2016-08-24 23:59:59'
查询应该说:
获取开始日期在范围内的所有记录,然后对于所有这些记录,总结开始时间与 end_date 或我感兴趣的一天结束之间的分钟数(如果在此之前) end_date.
如何添加第二天的剩余分钟数的问题有类似的解决方案。
首先,您需要确保start 在计算分钟时以类似的方式处理:
SELECT Sum(
Timestampdiff(
minute,
GREATEST(start, '2016-08-24 00:00:00'),
LEAST(end_date, '2016-08-24 23:59:59')
)
) AS shift_mins
与上一次更改类似,它执行以下操作:
- 如果
start 是前一天,则仅从您感兴趣的当天开始计算
- 如果
start 是您感兴趣的一天中的某个时间,那么一切都像以前一样
现在您还需要调整您的WHERE 子句以确保您获得所需的各种记录。这些是
-
start 和 end_date 在您感兴趣的日期内的记录
- 记录
start 在您感兴趣的那一天之前,end_date 在那一天之后
- 记录
start 在您感兴趣的那一天之前和end_date 在那一天之内的位置
- 记录
start 在当天和end_date 在之后的位置
条件非常简单:
WHERE
start < `2016-08-24 23:59:59` AND end_date > `2016-08-24 00:00:00`
所以整个语句应该是这样的:
SELECT Sum(
Timestampdiff(
minute,
GREATEST(start, '2016-08-24 00:00:00'),
LEAST(end_date, '2016-08-24 23:59:59')
)
) AS shift_mins
FROM
`student_shift_history`
WHERE
student_id = 9652 AND
start < `2016-08-24 23:59:59` AND
end_date > `2016-08-24 00:00:00`
应该可以。如果没有,您仍然可以看到图片:-)