关于在Progress SQL中将整数时间转换为HH:MM:SS::00格式及整数时间戳字段转VARCHAR的技术咨询
嘿,Juliano!针对你提到的两个需求——把Progress数据库的整数字段nrHoraRegistro转换为VARCHAR类型,以及将该整数时间值格式化为HH:MM:SS::00,我整理了可行的SQL方案,一起来看看:
一、将整数字段
nrHoraRegistro转换为VARCHAR类型 在Progress SQL中修改字段类型,操作前务必备份数据避免意外丢失,具体方案分两种场景:
直接修改字段类型(适合数据量小、无需额外处理的情况):
ALTER TABLE 你的表名 ALTER COLUMN nrHoraRegistro VARCHAR(20); -- 长度可根据实际需求调整,比如存HHMMSS格式的话8位足够Progress会自动完成整数到字符串的隐式转换,原有数值会直接转为对应字符串。
分步转换(适合需要确保数据准确性、或有特殊格式要求的场景):
-- 1. 新增临时VARCHAR字段 ALTER TABLE 你的表名 ADD COLUMN temp_nrHoraRegistro VARCHAR(20); -- 2. 将原整数字段数据转换为字符串存入临时字段 UPDATE 你的表名 SET temp_nrHoraRegistro = CAST(nrHoraRegistro AS VARCHAR(20)); -- 3. 删除原整数字段 ALTER TABLE 你的表名 DROP COLUMN nrHoraRegistro; -- 4. 将临时字段重命名为原字段名 ALTER TABLE 你的表名 RENAME COLUMN temp_nrHoraRegistro TO nrHoraRegistro;
二、将整数时间值转换为
HH:MM:SS::00格式 这里需要根据你的整数时间戳存储规则选择对应方案,常见两种场景如下:
情况1:整数是HHMMSS格式的数字(比如134520代表13:45:20)
我们可以先将整数转为字符串,拆分出小时、分钟、秒后拼接成目标格式:
SELECT nrHoraRegistro, CONCAT( SUBSTRING(LPAD(CAST(nrHoraRegistro AS VARCHAR(6)), 6, '0'), 1, 2), ':', SUBSTRING(LPAD(CAST(nrHoraRegistro AS VARCHAR(6)), 6, '0'), 3, 2), ':', SUBSTRING(LPAD(CAST(nrHoraRegistro AS VARCHAR(6)), 6, '0'), 5, 2), '::00' ) AS formatted_time FROM 你的表名;
其中LPAD函数用于补前导零,确保不足6位的整数(比如930代表00:09:30)也能生成标准格式。
情况2:整数是从某个时间点开始的总秒数(比如49520代表13小时45分20秒)
这种情况需要通过计算拆分出小时、分钟、秒:
SELECT nrHoraRegistro, CONCAT( LPAD(CAST(FLOOR(nrHoraRegistro / 3600) AS VARCHAR(2)), 2, '0'), ':', LPAD(CAST(FLOOR((nrHoraRegistro % 3600) / 60) AS VARCHAR(2)), 2, '0'), ':', LPAD(CAST(nrHoraRegistro % 60 AS VARCHAR(2)), 2, '0'), '::00' ) AS formatted_time FROM 你的表名;
如果字段已经转为VARCHAR类型,只需在计算前先转回整数:
SELECT nrHoraRegistro, CONCAT( LPAD(CAST(FLOOR(CAST(nrHoraRegistro AS INT) / 3600) AS VARCHAR(2)), 2, '0'), ':', LPAD(CAST(FLOOR((CAST(nrHoraRegistro AS INT) % 3600) / 60) AS VARCHAR(2)), 2, '0'), ':', LPAD(CAST(CAST(nrHoraRegistro AS INT) % 60 AS VARCHAR(2)), 2, '0'), '::00' ) AS formatted_time FROM 你的表名;
内容的提问来源于stack exchange,提问作者Juliano Medeiros
相关产品推荐
相关产品推荐

