【问题标题】:Summing timestamp returning incorrect value and format求和时间戳返回不正确的值和格式
【发布时间】:2014-01-31 17:26:10
【问题描述】:

我希望在给定时间段内缩短预定时间。我们的开始和结束计划时间是日期时间,所以我将它们转换为时间戳。当我不对它们求和时,一切看起来都是正确的,但是当我在一段时间内对它们求和时,输出不是时间戳格式并且数字不正确。

我正在使用的查询:

select sal.public_name, sum(timediff(timestamp(end_time), timestamp(start_time)))
from bi.support_agents_list sal
join bi.support_sp_shifts_scheduled ss
on ss.agent_sp_id = sal.sp_id
join bi.support_sp_shifts s 
on s.pk_id = ss.pk_id
where date(start_time) between '2014-01-29' and '2014-01-31'
group by sal.public_name

我得到的一些结果示例:

代理 1:53000 - 应该是 5.5 小时或 5:30

代理 2:196000 - 应该是 20 小时

对此有什么想法吗?我希望我的输出以小时为单位,因此 5 小时 30 分钟的格式为 5.5 而不是 5:30。

【问题讨论】:

    标签: mysql datetime time type-conversion aggregate-functions


    【解决方案1】:

    试试这个而不是总和

       date_format(timediff(timestamp(end_time), timestamp(start_time)), 
       '%k hours, %i minutes, %s seconds') as thesum
    

    这样

     select sal.public_name, 
       date_format(timediff(timestamp(end_time), timestamp(start_time)), '%k hours, %i minutes, %s seconds') as thesum
     from bi.support_agents_list sal
    

    【讨论】:

    • 谢谢。当我这样做时,它适用于单个 timediff,但是当我对它们求和时,它会对输出进行四舍五入。所以对于代理 1,它给了我 5 而不是 5.5 或 5:30
    • 如何求和,举个例子。
    【解决方案2】:

    使用 datetime sum(datetime) 进行聚合计算时,结果不是您所期望的(=无法对 datetimes 求和)。您最好将日期时间转换为聚合函数之前的秒数,然后将其转换回时间。

    您的聚合函数调用将如下所示:

    select sec_to_time(sum(unix_timestamp(end_time)-unix_timestamp(start_time)))
    

    请注意,您可能会达到时间数据类型可以包含的最大值,并且 unix_timestamp 从 1970 年开始。

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      相关资源
      最近更新 更多