如何在一天结束前计算总分钟数?

时间:2016-08-25 11:17:16

标签: mysql sql datetime

在我的数据库表格中说我有以下记录

enter image description here

现在我怎么能得到学生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 上的总分钟数。任何帮助,将不胜感激。

1 个答案:

答案 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子句,以确保获得所需的各种记录。这些是

  • 记录startend_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`

那应该有用。如果没有,你仍然可以得到图片: - )