暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 自带to_date函数挖了一个坑。

前言

今天下午开发妹子又在群里发问了。

"为何相同的语句可以在 Oracle中查到数据?迁移到 PostgreSQL无法查找数据啊?"

这不是很容易吗?数据肯定不一致啊,我心想道。“把 SQL发送过来看看吧!”

只见她迅速丢出一个txt文本,打开的文本是一段长达200行 SQL代码。那时候我就懵逼了,这要查数据不一致,真的要查很久啊。

定位问题

我随便截屏一下,一整个页面都截不完啊。

面临这种 SQL时,只能进行拆分。就是一块一块的拆开,然后检查拆开的 SQL。目前看来没有其他比较好的办法。一层一层地剥下去,就像俄罗斯的套娃一样。终于拨到其中的一层发现了一个问题。

在这里,我在 PG中查询0条数据,在 Oracle中查询是58条数据。所以问题出在哪里呢?事实上,错误的地方在to_date这里。

请注意,该表的字段 crtime为 timestamp类型。在查看一下to_date函数,您可以找到两个函数。红色框是PostgreSQL内置的to_date函数,并返回 date类型。

在 PostgreSQL中, date类型与 Oracle的Date类型不一致,它不带时分秒。因此,当我们从 Oracle迁移到 PostgreSQL为了兼容,将使用 timetamp类型进行转换,因此表上的 crtime是 timestamp类型。

问题的解决也很简单,使用第三方插件提供的to_date函数,返回 timestamp类型就是 ok。如图所示使用亚马逊的工具包aws_oracle_ext下的to_date就可以解决这个问题,也可以使用 orafce插件下的to_date。

后记

"妹子,问题找到了,就是眼睛看花了。"


文章转载自励志成为PostgreSQL大神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论