【问题标题】:How to calculate total minutes before end of day?如何计算一天结束前的总分钟数?
【发布时间】:2016-08-25 11:17:16
【问题描述】:

假设在我的数据库表中我有以下记录

现在我怎样才能得到学生 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 sql datetime


    【解决方案1】:

    您正在为每一行考虑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`
    

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

    【讨论】:

    • 谢谢老哥,效果很好,但它提出了另一个问题,现在我如何查看第二天​​剩余的分钟数?
    • 那么你必须改变你的 where 条件。我要改变我的答案。
    • 如果您能提供一个涵盖这两种情况的查询,将不胜感激。
    猜你喜欢
    • 2017-11-26
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多