Есть ли способ не менять тип varchar, при расчете временного интервала? - PullRequest
0 голосов
/ 03 сентября 2018

Тип данных в столбце "длина" - varchar. Мне нужно рассчитать среднюю длину звука.

Нужно ли менять тип данных на datetime или есть способ этого не делать?

Боюсь, если я это сделаю, мои значения могут стать неверными.

Спасибо!

Пример

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

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Переключите формат данных на число - но количество секунд продолжительности. Вы не будете ограничены произвольными ограничениями time, и вы можете легко использовать это значение для расчетов.

Если значение length всегда равно 8 символам, вы можете сделать:

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

Если после вычислений вы хотите представить значение в формате ЧЧ: ММ: СС, вы можете преобразовать его обратно в этот формат.

0 голосов
/ 03 сентября 2018

Ответ - нет. Это как вы можете умножить YourNAme и HisName?

Таким образом, оно должно быть преобразовано в действительное число.

Тем не менее, вы все равно можете сделать некоторое сложение или умножение, используя только синтаксис mysql. Движок неявно преобразует его для вас.

Из вашего примера каждая строка имеет чч: мм: сс, верно? где: разделение столбцов? Если разделение еще не выполнено, используйте подстроку или regex для ее разделения.

Предполагая, что чч, мм и сс разделены.

Вы действительно можете выполнять арифметику, используя SQL

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

Если вы не хотите разделять столбцы, просто используйте подстроку или регулярное выражение для разделения во время запроса.

Теперь вы можете просто суммировать все запросы и разделить их на Ntimes

После того, как вы получите значение. Вы переводите его обратно в часы, минуты и секунды. Смотрите пример кода ниже.

  //
  $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);

На самом деле вы можете выполнить несколько тестов, если вы действительно боитесь вычислений:)

0 голосов
/ 03 сентября 2018

Вам следует изменить тип данных на time, потому что в его текущем формате вы не можете выполнять какие-либо расчеты времени для ваших данных без преобразования их во времени в любом случае.

Как указано в руководстве mysql для типа данных time :

Тип ВРЕМЯ может использоваться не только для представления времени суток (которое должно быть не более 24 часов), но также истекшего времени или интервала времени между двумя событиями (которое может быть значительно больше 24 часов, или даже отрицательным). ).

Если вас беспокоит потеря некоторых данных из-за неправильного форматирования, протестируйте преобразование varchar в время с помощью функции str_to_date () . Везде, где возвращается ноль с правильной маской, ваши данные имеют неправильный формат.

...