2017-06-08 120 views
2

oracle时间戳示例:26-APR-17 09.40.13.243356000oracle时间戳转换为postgres时间戳?

您好我有一个场景我将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

+0

没有数据库将任意添加一个半小时。这听起来像是一个时区问题,如果两个数据库中的一个使用印度时区。尽管你没有发布* actual *代码。您发布的值看起来像某些查询的*本地化结果*,而不是实际值。很少有国家使用这种分隔符。只有印度使用了半小时的偏移量(我知道) –

+1

为避免本地化问题,请使用ISO8601格式,即'YYYY-MM-DDTHH:MM:SS.ffffZ'或'YYYY-MM-DDTHH:mm:ss。 ffff + HH:mm' –

+0

@PanagiotisKanavos看图片。我编辑了这个问题。 –

回答

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' 
     ); 
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标准。

+1

如果最后三位数字不全为0,则会导致错误的结果。 –