计算时间间隔时,有没有一种方法可以不更改varchar类型?

时间:2018-09-03 04:47:46

标签: mysql sql select varchar

“长度”列中的数据类型为varchar。 我需要计算音频的平均长度。

我需要将数据类型更改为datetime还是有办法不这样做?

我担心,如果这样做,我的价值观可能会变得不正确。

谢谢!

示例

Length
22:32:00
11:22:12
10:00:00

3 个答案:

答案 0 :(得分:0)

您应该将数据类型更改为time,因为在当前格式下,如果不将其转换为时间,就无法对数据进行任何时间计算。

time data type上的mysql手册所述:

  

TIME类型不仅可以用来表示一天中的某个时间(必须少于24小时),还可以用来表示经过的时间或两个事件之间的时间间隔(可能大于24小时,甚至可以是负数) )。

如果您担心由于格式错误而丢失一些数据,请使用str_to_date()函数测试varchar到时间的转换。无论它返回带有适当掩码的null,您的数据格式都是错误的。

答案 1 :(得分:0)

将数据格式切换为数字-而是持续时间的秒数。您将不受time的任意限制,并且可以轻松地使用该值进行计算。

如果您的length值始终为8个字符,则可以执行以下操作:

select (substring_index(length, ':', 1) * 60 * 60 +
        substr(length, 4, 2) * 60 +
        substring_index(length, ':', -1)
       ) as duration_seconds

如果在计算后想要将值表示为HH:MM:SS,则可以转换回该格式。

答案 2 :(得分:0)

答案是否定的。就像您可以将YourNAme和HisName相乘吗?

因此应将其转换为实数。

但是,您仍然可以单独使用mysql语法进行一些加法或乘法。引擎会为您隐式转换它。

在您的示例中,每一行都有hh:mm:ss,对吗?哪里:列分离? 如果尚未分隔,请使用子字符串或regex分隔它。

假设hh,mm和ss分开。

您实际上可以使用SQL进行算术

SELECT 
    (SECONDS + MINUTES*60 + HOURS*60*60 ) as 'LengthInSeconds' 
FROM yourTable

如果您不想分隔为列,只需在查询过程中使用子字符串或正则表达式分隔即可。

您现在可以将所有查询相加并除以N次

获得值之后。您将其转换回小时,分钟和秒。请参见下面的示例代码。

  //
  $average = $totalAccumulatedSeconds/3;

  // Time calculations for hours, minutes and seconds
  $hours = Math.floor(($average % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  $minutes = Math.floor(($average % (1000 * 60 * 60)) / (1000 * 60));
  $seconds = Math.floor(($average % (1000 * 60)) / 1000);

实际上,如果您真的担心计算,可以执行几个测试:)