将oracle时间戳转换为postgres时间戳?

时间:2017-06-08 10:04:45

标签: sql postgresql psql

oracle timestamp示例:26-APR-17 09.40.13.243356000

嗨我有一个场景我正在将oracle时间戳转换为postgres时间戳但输出不是预期的。

在psql中运行查询

migration=# SELECT TO_TIMESTAMP('26-APR-17 09.40.13.243356000','DD-MON-YY HH24.MI.SS:MS') :: timestamp without time zone;
        to_timestamp
----------------------------
   2017-04-26 09:15:55.864128                  ----- this is output 
(1 row) 

输出应为:2017-04-26 09:40:13.243356

enter image description here

2 个答案:

答案 0 :(得分:3)

问题在于243356000被视为毫秒,这可以解释大约半小时的奇怪偏移。

修剪最后三个sigits并使用US微秒:

SELECT to_timestamp(
          regexp_replace(
             '26-APR-17 09.40.13.243356000',
             '\d{3}$',
             ''
          ),
          'DD-MON-YY HH24.MI.SS.US'
       );

答案 1 :(得分:2)

该错误是毫秒格式掩码MS的无效值的结果。

As documented in the manual允许的毫秒值为000到999

然而,由于尾随零,

.243356000对于微秒(US格式掩码)也无效。

如果要使用该格式,则必须从输入字符串中删除零,例如:使用rtrim()

psql (9.6.3)
Type "help" for help.

postgres> SELECT TO_TIMESTAMP(rtrim('26-APR-17 09.40.13.243356000','0'),'DD-MON-YY HH24.MI.SS.US');
         to_timestamp
-------------------------------
 2017-04-26 09:40:13.243356+02
(1 row)

postgres>

我也同意PanagiotisKanavos认为最好使用与语言环境无关的格式(即月份和4位数字的数字),最好是时间戳值的ISO标准。