Mysql 如何计算每天结束前的总分钟数?

Mysql 如何计算每天结束前的总分钟数?,mysql,sql,datetime,Mysql,Sql,Datetime,假设在我的DB表中,我有以下记录 现在,我如何获得学生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:

假设在我的DB表中,我有以下记录

现在,我如何获得学生9652在2016-08-24 00:00:012016-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上花费的总分钟数。任何帮助都将不胜感激

您正在考虑每行的
结束日期。您需要检查
结束日期
是否大于您正在检查的日期的结束日期

我目前无法尝试,但伪工作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' 
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`
这个查询应该是这样的:

获取开始日期在范围内的所有记录,然后对所有这些记录,总结开始时间与
结束日期
或我感兴趣的一天结束之间的分钟数(如果在
结束日期
之前)


如何为第二天添加剩余分钟的问题也有类似的解决方案

首先,在计算分钟数时,您需要确保对
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
子句,以确保获得所需的各种记录。这些是

  • 开始日期
    结束日期
    都在您感兴趣的日期内的记录
  • 记录
    开始日期
    在您感兴趣的日期之前,
    结束日期
    在该日期之后
  • 记录
    开始日期
    在您感兴趣的日期之前,而
    结束日期
    在该日期之内
  • 记录
    开始日期
    在一天之内而
    结束日期
    在之后
这样做的条件非常简单:

WHERE
    start < `2016-08-24 23:59:59` AND end_date > `2016-08-24 00:00:00`
在哪里
开始<`2016-08-24 23:59:59`和结束日期>`2016-08-24 00:00:00`
所以整个声明应该是这样的:

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' 
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`
选择Sum(
时间差(
分钟,
最伟大的(开始于2016-08-24 00:00:00),
最少(截止日期“2016-08-24 23:59:59”)
)
)当班
从…起
`学生(轮班)(历史)`
哪里
学生id=9652和
开始<`2016-08-2423:59:59`和
结束日期>`2016-08-24 00:00:00`

这应该行得通。如果没有,您仍然可以看到图片:-)

谢谢,它工作得很好,但它提出了另一个问题,现在我如何检查第二天剩余的分钟数?然后您必须更改where条件。我将改变我的答案。如果你能提出一个问题,涵盖这两种情况,我将不胜感激。