如何将'May 11 2022 9:16AM'字符串正确转换为timestamp时间戳
返回结果后缀含义
你看到的00.000 -0300是带时区时间戳(timestamptz类型)的标准输出组成部分:
00.000是亚秒精度字段,因为你输入的时间字符串没有指定毫秒/微秒值,这部分默认填充为0-0300是当前数据库会话的时区偏移量,代表当前会话时区比UTC时间晚3小时,不是解析错误导致的。
原写法的问题与正确转换方案
你当前使用的格式串存在隐患:没有匹配输入字符串末尾的AM标识,仅靠HH匹配12小时制时间,遇到下午的时间值会出现解析错误。
要得到你预期的2022-05-11 09:16:00格式结果,有两种常用写法:
- 显式转换为不带时区的timestamp类型
补全格式串的AM匹配规则后,将to_timestamp返回的带时区结果强转为不带时区的timestamp类型,会自动舍弃时区偏移和亚秒补零部分:
执行返回结果即为select to_timestamp('May 11 2022 9:16AM', 'Month DD YYYY HH12:MI AM')::timestamp;2022-05-11 09:16:00。 - 直接格式化为目标字符串
如果需要直接得到对应格式的字符串结果,可以用to_char指定输出格式:select to_char( to_timestamp('May 11 2022 9:16AM', 'Month DD YYYY HH12:MI AM'), 'YYYY-MM-DD HH24:MI:SS' );
注意:格式串中建议用
HH12明确指定12小时制,和AM标识搭配可以覆盖所有12小时制时间的解析场景,避免隐式匹配带来的异常。
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

