ORACLE資料庫中SCN與時間的轉換

junsansi發表於2009-06-09

 

  10g中提供了兩個函式scn_to_timestamp()和timestamp_to_scn()用來執行時間戳和SCN的轉換,例如:

    例如:
    JSSPRE> select timestamp_to_scn(sysdate) from dual;

    TIMESTAMP_TO_SCN(SYSDATE)
    -------------------------
    1263291

    JSSPRE> select scn_to_timestamp(1263291) from dual;

    SCN_TO_TIMESTAMP(1263291)
    ---------------------------------------------------------------------------
    02-JUN-09 10.12.28.000000000 AM

  不過在之前的版本中並沒有提供這樣的函式,而是通過一個系統物件SYS.SMON_SCN_TIME來提供SCN和時間的對映資訊。

  在10g之前版本,SYS.SMON_SCN_TIME最多擁有1440條記錄。這個最大記錄數是這樣計算出來的,ORACLE平均每5分鐘同步一次該表資料,最大儲存最近5天的記錄,因此就相當於12(每小時更新次數)*24*5=1440。

  SCN資訊在該系統物件中儲存於SCN_WRP(SCN_WRAP)和SCN_BAS(SCN_BASE)兩列中,當資料SCN增長時,首先是BASE部分自增,如果BASE部分達到上限,則初始化為0,然後WRAP部分自增1。

  明白這個邏輯,我們就可以通過對SYS.SMON_SCN_TIME計算,來執行時間和日期的轉換。

    例如,有scn如下:
    JSSPRE> select max(scn_bas) from sys.smon_scn_time;

    MAX(SCN_BAS)
    ------------
    1269168

    查詢該SCN對應的時間,則可以通過下列的方式:
    JSSPRE> select time_dp,scn_wrp*65535*65535+scn_bas scn from sys.smon_scn_time
    2 where scn_bas='1269168';

    TIME_DP SCN
    ------------------- ----------
    2009-06-02 13:47:20 1269168

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-605632/,如需轉載,請註明出處,否則將追究法律責任。

相關文章