0

我正在将应用程序从 oracle 迁移到 postgresql。在我已经迁移的一个函数中,我将数据从不同的 oracle 数据库(oracle 中的 db 链接,postgresql 中的 oracle_fdw 扩展)从几个表复制到我的 postgresql db 中的本地表中。但是,我收到下一个错误:

 NOTICE:  Insert data into table from remote table : insert into IP_MAN 
 select * from IP_MAN_production
 NOTICE:     PROCEDURE copy_table : V_Step = 4 // **SQLERRM = date/time field 
 value out of range: "1400-02-29 00:00:00 AD"**
 CONTEXT:  converting column "birthday" for foreign table scan of "ip_man_production", 
 row 32481

当我尝试在 oracle db 中选择特定行时,我得到下一个值:

select date from bezeq.ip_manuim where 
birthday=to_date('29/02/1400','dd/mm/yyyy');

  birthday
  --------
 01010001

生日是数据类型是没有时区的时间戳。

任何想法 ?

4

1 回答 1

1

PostgreSQL 认为 1400 年不是闰年。

请参阅以下定义src/include/utils/datetime.h

/*
 * These are the rules for the Gregorian calendar, which was adopted in 1582.
 * However, we use this calculation for all prior years as well because the
 * SQL standard specifies use of the Gregorian calendar.  This prevents the
 * date 1500-02-29 from being stored, even though it is valid in the Julian
 * calendar.
 */
#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))

正如评论所说,拒绝在技术上是错误的1400-02-29,但模糊地提及 SQL 标准是合理的。我不知道这个论点是否有效,但我不会深入挖掘,因为看起来你已经解决了你的问题。

于 2017-07-24T16:12:06.257 回答