在我的数据库表格中说我有以下记录
现在我怎么能得到学生9652在 2016-08-24 00:00:01 上花费的总分钟数,直到 2016-08-24 23:59:59 ?我试过的查询
SELECT Sum(Timestampdiff(minute, start, end_date)) 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'
以上查询也给出了第二天的总分钟数。
我需要的是学生9652花在 2016-08-24 上的总分钟数。任何帮助,将不胜感激。
答案 0 :(得分:2)
您考虑每行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`
那应该有用。如果没有,你仍然可以得到图片: - )