Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将mm:ss时间字符串转换为秒整数(postgres/liquibase)_Java_Postgresql_Liquibase - Fatal编程技术网

Java 如何将mm:ss时间字符串转换为秒整数(postgres/liquibase)

Java 如何将mm:ss时间字符串转换为秒整数(postgres/liquibase),java,postgresql,liquibase,Java,Postgresql,Liquibase,情况如下: -我有一个处理短视频的spring boot应用程序。 -一开始它就使用liquibase,并有一些更改日志改变数据库结构等。下面有一个posgresql数据库。每年只有不到20000条记录。 -我以前收集过包含字符串格式MM:SS记录持续时间的数据 -视频引擎即将更改为以表示秒数的单个数字存储录制持续时间的引擎 -我想制作更多处理此类操作的变更日志: 为秒创建另一列 将MM:SS字符串转换为second并存储在新列中 删除旧列并重命名新列 最大的问题是在内部进行简单计算的转换查询。

情况如下: -我有一个处理短视频的spring boot应用程序。
-一开始它就使用liquibase,并有一些更改日志改变数据库结构等。下面有一个posgresql数据库。每年只有不到20000条记录。
-我以前收集过包含字符串格式MM:SS记录持续时间的数据
-视频引擎即将更改为以表示秒数的单个数字存储录制持续时间的引擎
-我想制作更多处理此类操作的变更日志:

为秒创建另一列
将MM:SS字符串转换为second并存储在新列中
删除旧列并重命名新列

最大的问题是在内部进行简单计算的转换查询。在使用下面的一些答案后,我最终得出了以下结论:

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 ","

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

你有一个冲突是你的描述。您说您有一个格式为MM:SS的文本列,但是您的转换计划是转换HH:MM。这些格式的转换将非常不同。如果是HH: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
此外,您需要在计划中添加一个步骤,以验证每行中的列是否正确格式化。IMHO没有存储在文本(字符串)中的日期时间值;是的,有些字符串包含正确格式的数据,希望和好运-不要指望它