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
答案 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标准。