列“length”中的数据类型是varchar。我需要计算音频的平均长度。我是否需要将数据类型更改为datetime,或者是否有不这样做的方法?我担心,如果我这样做,我的价值观可能会变得不正确。谢谢!例子
Length 22:32:00 11:22:12 10:00:00
qaxu7uf21#
将数据格式转换为一个数字,但要更改持续时间的秒数。你不会被限制在 time 你可以很容易地用这个值来计算。如果你的 length 值始终为8个字符,您可以执行以下操作:
time
length
select (substring_index(length, ':', 1) * 60 * 60 + substr(length, 4, 2) * 60 + substring_index(length, ':', -1) ) as duration_seconds
如果在计算之后,希望将值表示为hh:mm:ss,则可以转换回该格式。
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);
实际上,如果你真的害怕计算,你可以执行几个测试:)
1qczuiv03#
您应该将数据类型更改为 time 因为在当前格式中,如果不将数据转换为时间,就无法对数据进行任何时间计算。正如mysql关于时间数据类型的手册所说:时间类型不仅可以表示一天中的某个时间(必须小于24小时),还可以表示经过的时间或两个事件之间的时间间隔(可能远远大于24小时,甚至是负值)。如果您担心由于格式错误而丢失一些数据,那么可以使用str\u to\u date()函数测试varchar到时间的转换。如果使用正确的掩码返回null,则数据的格式是错误的。
3条答案
按热度按时间qaxu7uf21#
将数据格式转换为一个数字,但要更改持续时间的秒数。你不会被限制在
time
你可以很容易地用这个值来计算。如果你的
length
值始终为8个字符,您可以执行以下操作:如果在计算之后,希望将值表示为hh:mm:ss,则可以转换回该格式。
0dxa2lsx2#
答案是否定的。你能把你的名字和他的名字相乘吗?
所以它应该转换成一个实数。
但是,您仍然可以单独使用mysql语法进行一些加法或乘法。引擎将隐式地为您转换它。
从你的例子来看,每一行都有hh:mm:ss,对吗?其中:柱间距是多少?如果尚未分离,请使用substring或regex将其分离。
假设hh、mm和ss是分开的。
实际上,您可以使用sql执行算术
如果不想分隔到列,只需在查询期间使用substring或regex分隔即可。
现在可以将所有查询相加,然后除以n次
在你得到价值之后。你把它转换回小时,分钟和秒。请参见下面的示例代码。
实际上,如果你真的害怕计算,你可以执行几个测试:)
1qczuiv03#
您应该将数据类型更改为
time
因为在当前格式中,如果不将数据转换为时间,就无法对数据进行任何时间计算。正如mysql关于时间数据类型的手册所说:
时间类型不仅可以表示一天中的某个时间(必须小于24小时),还可以表示经过的时间或两个事件之间的时间间隔(可能远远大于24小时,甚至是负值)。
如果您担心由于格式错误而丢失一些数据,那么可以使用str\u to\u date()函数测试varchar到时间的转换。如果使用正确的掩码返回null,则数据的格式是错误的。