今天下午開發妹子又在群裡發問了。
"為何相同的語句可以在 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。
"妹子,問題找到了,就是眼睛看花了。"