Как преобразовать строку времени mm: ss в целое число секунд (postgres / liquibase) - PullRequest
0 голосов
/ 30 апреля 2020

Вот ситуация: - У меня есть приложение с весенней загрузкой, которое обрабатывает короткие видео.
- При запуске оно использует liquibase и имеет несколько журналов изменений, изменяющих структуру БД и т. Д. c. Внизу есть posgre sql db. Число записей меньше 20 тыс. В год.
- ранее я собирал данные, содержащие продолжительность записи в строковом формате MM: SS
- движок видео собирается измениться на тот, который хранит продолжительность записи в одном числе, представляющем секунды
- я рассчитывал сделать больше журналов изменений, обрабатывающих такие операции:

создать еще один столбец за секунды
преобразовать строку MM: SS во вторую и сохранить ее в новом столбце
удалить старый столбец и переименуйте новый

Самая большая проблема - сделать запрос преобразования с простым вычислением внутри. После использования некоторых ответов ниже я получил следующее:

update recording set duration_seconds = case when duration ~ ':'
    then (60 * CAST (substr(duration, 1, position((':' - 1) in duration)) AS integer)) + (CAST (substr(duration, position((':' +1) in duration)) AS integer))
    else 60 * CAST (duration AS integer)
END

, но все равно получаю ошибку

[org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set classpath:/db/changelog/db.changelog-master.yaml::20200430_covert_time_string_to_seconds::xxxxxxxxxxxx:
     Reason: liquibase.exception.DatabaseException: ERROR: syntax error at or near ","

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Количество секунд в 1 часе и 5 минутах:

select extract(epoch from time '01:05') as time_sec -- 3900 = 1 * 60 * 60 + 5 * 60

Если у вас есть часть секунд:

select extract(epoch from time '01:05:01') as time_sec -- 3901
0 голосов
/ 01 мая 2020

У вас конфликт есть ваше описание. Вы говорите, что у вас есть текстовый столбец в формате MM: SS, но тогда ваш план конвертации - конвертировать ЧЧ: ММ. Конвертация для этих форматов будет совсем другой. Тем более, если это ЧЧ: ММ: СС. Предполагая, что ваш формат MM: SS означает, что 2 часа записывается как 120 или 120: 00. Если это так, извлечение эпохи, скорее всего, не удастся. Следующее будет работать.

set new_duration = case when duration ~ ':' 
                        then 
                           60*(substr(duration,1,position(duration,':'-1)::integer
                             +(substr(duration,position(duration,':'+1)::integer
                        else 
                           60*duration::integer

Кроме того, вам нужно добавить шаг в план, чтобы проверить правильность форматирования столбца в каждой строке. ИМХО, нет такой вещи, как значение даты и времени, хранимое в тексте (строке); да, есть строки, которые с надеждой и удачей содержат правильные отформатированные данные - не рассчитывайте на это.

...