Sql oracle时间戳到postgres时间戳的转换?

Sql oracle时间戳到postgres时间戳的转换?,sql,postgresql,psql,Sql,Postgresql,Psql,oracle时间戳示例:2017年4月26日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 --------

oracle时间戳示例:2017年4月26日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-2609:40:13.243356


该错误是毫秒格式掩码MS的无效值导致的

毫秒的允许值为000到999

.243356000对于微秒US格式掩码也无效,因为后面有零

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

psql 9.6.3 键入“帮助”以获取帮助。 postgres>选择时间戳'26-APR-17 09.40.13.243356000'、'0'、'DD-MON-YY HH24.MI.SS.US'; 时间戳 ---------------- 2017-04-26 09:40:13.243356+02 一排 博士后>
我也同意PanagiotisKanavos的观点,即最好使用独立于区域设置的格式,即月份的数字和4位数的年份,最好是时间戳值的ISO标准

问题是243356000被视为毫秒,这解释了大约半小时的奇怪偏移量

修剪最后三个SIGIT,并使用US进行微秒:

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

任何数据库都不会随意添加半小时。如果两个数据库中有一个使用印度时区,这听起来像是时区问题。但是你没有发布实际的代码。您发布的值看起来像某些查询的本地化结果,而不是实际值。很少有国家使用这种分隔符。只有印度使用我知道的半小时偏移量来避免本地化问题,使用ISO8601格式,即YYYY-MM-DDTHH:MM:SS.FFZ或YYYY-MM-DDTHH:MM:SS.ffff+HH:mm@PanagiotisKanavos看这幅画。我已编辑了问题。如果最后三位数字不都是0,则会导致错误结果。