在计算时间间隔时,有没有办法不改变varchar的类型?

wecizke3  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(394)

列“length”中的数据类型是varchar。我需要计算音频的平均长度。
我是否需要将数据类型更改为datetime,或者是否有不这样做的方法?
我担心,如果我这样做,我的价值观可能会变得不正确。
谢谢!
例子

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

qaxu7uf21#

将数据格式转换为一个数字,但要更改持续时间的秒数。你不会被限制在 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,则可以转换回该格式。

0dxa2lsx

0dxa2lsx2#

答案是否定的。你能把你的名字和他的名字相乘吗?
所以它应该转换成一个实数。
但是,您仍然可以单独使用mysql语法进行一些加法或乘法。引擎将隐式地为您转换它。
从你的例子来看,每一行都有hh:mm:ss,对吗?其中:柱间距是多少?如果尚未分离,请使用substring或regex将其分离。
假设hh、mm和ss是分开的。
实际上,您可以使用sql执行算术

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

如果不想分隔到列,只需在查询期间使用substring或regex分隔即可。
现在可以将所有查询相加,然后除以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);

实际上,如果你真的害怕计算,你可以执行几个测试:)

1qczuiv0

1qczuiv03#

您应该将数据类型更改为 time 因为在当前格式中,如果不将数据转换为时间,就无法对数据进行任何时间计算。
正如mysql关于时间数据类型的手册所说:
时间类型不仅可以表示一天中的某个时间(必须小于24小时),还可以表示经过的时间或两个事件之间的时间间隔(可能远远大于24小时,甚至是负值)。
如果您担心由于格式错误而丢失一些数据,那么可以使用str\u to\u date()函数测试varchar到时间的转换。如果使用正确的掩码返回null,则数据的格式是错误的。

相关问题