“长度”列中的数据类型为varchar。 我需要计算音频的平均长度。
我需要将数据类型更改为datetime还是有办法不这样做?
我担心,如果这样做,我的价值观可能会变得不正确。
谢谢!
示例
Length
22:32:00
11:22:12
10:00:00
答案 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);
实际上,如果您真的担心计算,可以执行几个测试:)