PostgreSQL 自帶to_date函數挖了一個坑.

2021-02-19 勵志成為PostgreSQL大神
前言

今天下午開發妹子又在群裡發問了。

"為何相同的語句可以在 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函數
    context:  sql function "test_f12"return test這種寫法一般用在寬表,並且通過函數要返回很多欄位的時候,就不需要自己一個欄位一個欄位的寫。也可以定義為最後需要說明的是sql函數中的參數,postgresql定義$1表示第一個參數,$2為第二個參數並以此類推。
  • 將函數索引從Oracle遷移到PostgreSQL
    根據PostgreSQL文檔,函數可以是3種類型,每一個函數都有一個易變性分類可能是VOLATILE、STABLE或者IMMUTABLE。如果CREATEFUNCTION命令沒有指定一個分類,則默認是VOLATILE。
  • PostgreSQL Tips: 動態SQL
    前言前幾天 Postgres 群裡有人問如何在 Postgres 裡實現動態列的行轉列,於是我整理了PostgreSQL 實現動態行轉列的方法匯總然後被問到如何直接通過一個函數返回結果,而不是返回一個待執行的 SQL 語句,於是我參考下面的教程,實現了一個函數返回 json,先把代碼附上
  • Excel日期及時間函數——DATEVALUE函數
    DATEVALUE函數概念及語法DATEVALUE函數概念:將日期值從字符串轉化為序列數,表示日期時間代碼的日期;DATEVALUE 函數將存儲為文本的日期轉換為 Excel 識別為日期的序列號。 例如,公式=DATEVALUE("1/1/2008") 返回 39448,即日期 2008-1-1 的序列號。
  • date函數判斷某月的最大天數
    在使用date函數過程中,發現date函數可以接受日期值以外的參數,如輸入=DATE(2008,2,31),會自動顯示為2008-3-2,於是便想出:   1.用此函數判斷一個月的最大天數:方法如下   如要求今年2月份的最大天數,便可以求今天3月份0號的值,因為0號不存在,但date函數也可以接受此值,根據此特性
  • PostgreSQL Tips:DATEDIFF
    DATE_PART('year', '2011-10-02'::date);  -- Result: 1PostgreSQL-月中的日期差異考慮使用 SQL Server 函數來計算兩個日期(以月為單位)之間的差額:SQL Server
  • 去哪兒PostgreSQL指南
    建議能用varchar(N) 就不用char(N),以利於節省存儲空間;3. 建議能用varchar(N) 就不用text,varchar;4. 建議使用default NULL,而不用default '',以節省存儲空間;5.
  • WEEKDAY、DATE、DATEIF和DAYS360函數總結
    三、計算兩個日期的減法函數DATEIF1、功能:用於計算兩個日期之間的天數、月數或年數。2、使用格式:=DATEIF(start_date,end_date,unit)3、參數說明:第一個參數:start_date 為一個日期,它代表時間段內的第一個日期或起始日期。
  • 截止目前,常用的與DATE函數有關的EXCEL函數你知道多少?
    我們在做表格的時候,為了簡便經常會用到很多函數公式,如果說我們對那些函數不認識的話,大概率的情況會增加我們的工作量,想想看,別人一個函數就能計算出自己想要的結果,而你只能一個一個的輸入
  • 滲透中利用postgresql getshell及注入技巧
    3.B站在線學習連結由於分享的資源連結經常被和諧,所以必須遷移到B站上供大家學習B站up主官方帳號:VMYKnetwork團隊0x00 前言研究postgresql資料庫如何getshell是在滲透中遇到一個pgAdmin的web管理頁面可以直接操作postgresql且通過網上的文章沒有達到9.6版本getshell的效果所以便有了以下文章。
  • PHP5中新增加的日期(date)函數的常量
    首頁 > 語言 > 關鍵詞 > php最新資訊 > 正文 PHP5中新增加的日期(date)函數的常量
  • PostgreSQL簡介及安裝
    PostgreSQL 可以用許多方法擴展,比如,通過增加新的數據類型、函數、操作符、聚集函數、索引。(你可以在網際網路上找到更多的信息,這裡就不搬運了,以後再詳細聊聊PostgerSQL 的江湖地位。)1.
  • 二級Office函數總結十:WEEKDAY、DATE、DATEDIF和DAYS360
    三、計算兩個日期的減法函數DATEDIF1、功能:用於計算兩個日期之間的天數、月數或年數。2、使用格式:=DATEDIF(start_date,end_date,unit)3、參數說明:第一個參數:start_date 為一個日期,它代表時間段內的第一個日期或起始日期。
  • hive函數
    :數學函數,字符函數,日期函數,條件函數,聚合函數。如substr('abcde',1,3)返回'abc'日期函數curdate:返回當前日期year(date):month(date):day(date):  返回日期date的年,月,日,類型為intdatediff(date1,date2):返回日期date1與date2相差的天數str_to_date將日期格式的字符轉換成指定格式的日期
  • Excel函數總結五:LOOKUP、HLOOKUP、VLOOKUP、WEEKDAY、DATE、DATEDIF和DAYS360
    三、縱向查找函數VLOOKUP1、功能:VLOOKUP是一個縱向查找函數,用於表格或數值數組的首列查找指定的數值,並由此返回表格或數組當前行中指定列處的數值。 六、計算兩個日期的減法函數DATEDIF1、功能:用於計算兩個日期之間的天數、月數或年數。2、使用格式:=DATEDIF(start_date,end_date,unit)3、參數說明:第一個參數:start_date 為一個日期,它代表時間段內的第一個日期或起始日期。
  • PostgreSQL | 查LAST DDL TIME,PG的三種方法
    前言今天遇到一個小問題,如果有人 DDL修改了表(例如drop了一個索引後),如何查詢最後的last ddl time。原本以為這是個小問題,結果發現這個問題居然還有點小麻煩。PG沒有LAST DDL TIME對Oracle而言,當drop index命令在表上執行完畢後。
  • MySQL5.7中如何使用開窗函數
    像這樣的需求,如果在Oracle、SQLserver、postgresql等資料庫中很容易實現,一個開窗函數row_nubmer() over(partition by xxx,yyy order by zzz)就可以解決。但是在MySQL8.0版本之前,是沒有這樣的開窗函數的。好在8.0之後的版本已經內置了開窗函數。不必自己寫實現邏輯了。
  • 七天騙了一個村,餡餅挖了一個坑
    昨天,公安部發文,揭露了一個騙子集團,只用了7天的時間,就騙光一個村的「殺豬盤」事件。第1天。騙子進村,開始宣傳造勢,給老人發雞蛋、發牙膏,都是些不值錢的小玩意。然後告訴村民們,回去拉人來,明天會有更多的雞蛋發給你們。
  • 【問答】MySQL DATE_FORMAT函數怎麼用?
    問: 在MySQL中如何使用DATE_FORMAT() 函數