Postgres无时区环境下将军用时间整数转换为标准时间的实现问询
PostgreSQL 整数型军事时间列转换为12小时制带am/pm格式方案
核心实现逻辑
直接通过3层函数嵌套完成转换,无需额外自定义函数:
- 先将整数转为4位字符串,左侧补0对齐,解决短位数的补位需求
- 按
HH24MI格式将补位后的字符串转为时间类型 - 通过格式化函数输出12小时制带am/pm的目标样式
完整SQL语句
SELECT TO_CHAR( TO_TIMESTAMP(LPAD(military_time::TEXT, 4, '0'), 'HH24MI')::TIME, 'FMHH12:MI am' ) AS formatted_time FROM 你的表名;
函数说明
LPAD(military_time::TEXT, 4, '0'):将整数转为字符串后,左侧补0直到长度为4,比如数值25会转为0025,数值900会转为0900TO_TIMESTAMP(..., 'HH24MI')::TIME:将4位字符串按24小时制的时分格式解析为时间类型TO_CHAR(..., 'FMHH12:MI am'):将时间格式化为12小时制样式,FM前缀会自动去掉数值前的多余空格,避免出现9:00 am这类前面带空格的结果
示例验证
对应给出的测试数值,转换结果完全匹配需求:
- 输入
1400→ 输出2:00 pm - 输入
1300→ 输出1:00 pm - 输入
25→ 输出12:25 am - 输入
900(整数存储时会自动去掉前导0,对应提到的0900) → 输出9:00 am
注意事项
如果你的military_time列存在超过合理时间范围的无效值(比如大于2359的数值),可以增加过滤条件避免解析报错:
SELECT TO_CHAR( TO_TIMESTAMP(LPAD(military_time::TEXT, 4, '0'), 'HH24MI')::TIME, 'FMHH12:MI am' ) AS formatted_time FROM 你的表名 WHERE military_time BETWEEN 0 AND 2359;
内容的提问来源于stack exchange,提问作者CrazySpatial
相关产品推荐
相关产品推荐

