pl/sql developer中關於TIMESTAMP顯示格式的疑問和學習

zhang41082發表於2019-03-31

ORACLE中的TIMESTAMP資料型別可能大家用的都比較少,所以即使最簡單的一個查詢返回的結果也會搞不清楚到底這個時間是什麼時間點。
比如:
27-1月 -08 12.04.35.877000 上午

這個時間到底是幾點呢?中午12:04分,那就錯了,其實使用to_char函式轉換後得到如下結果:
2008-01-27 00:04:35:877000
說明這個時間是凌晨的00:04分,而不是中午的12:04分。

[@more@]發生這個問題的原因如下:
首先來看一個實驗:
SELECT TO_CHAR(TO_DATE('2008-01-29 00:05:10', 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh:mi:ss am') FROM DUAL
首先把一個00:05分的時間進行轉換,按照'yyyy-mm-dd hh:mi:ss am'格式進行轉換,得到的結果是:
2008-01-29 12:05:10 上午
這說明oracle在進行日期轉換成字串的過程中,如果小時轉換使用的是12進位制的格式,則凌晨00點會被認為是上午12點,然後才是上午1點、2點、3點。。。
oracle中12進位制的計時不是從0-11,而是從1-12的,所以如果是夜裡零點,你不能記成1點,那隻能記成12點了。(不知道這是不是跟洋人的習慣有關?)

那麼我們來看下ORACLE中對TIMESTAMP的處理:
SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT'
返回結果DD-MON-RR HH.MI.SSXFF AM,可以看到,這裡預設情況下,使用的TIMESTAMP的格式是12進位制的小時。

問題到這裡已經找到根源了。

解決:
pl/sql developer中讀取的是登錄檔中設定的NLS_TIMESTAMP_FORMAT格式,那麼只要在登錄檔中設定oracle環境變數的地方(也就是設定ORACLE_HOME的地方)設定NLS_TIMESTAMP_FORMAT的格式(也就是建立這樣一個字串項,然後設定它的值為你轉換需要的掩碼,我一般設定為YYYY-MM-DD HH24:MI:SS:FF6),然後關掉PL/SQL DEVELOPER,再登陸進來,以後看到的TIMESTAMP時間就會自動轉換成你需要的格式了。

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

相關文章