plsql developer 中 TIMESTAMP 的顯示格式

Oracle 中的 TIMESTAMP 數據類型很多人用的都很少,所以即使最簡單的一個查詢返回的結果也會搞不清楚到底這個時間是什麼時間點。

例如:

27-1 月 -08 12.04.35.877000 上午

這個時間到底是幾點呢?中午 12:04 分,那就錯了,其實使用 to_char 函數轉換後得到如下結果:

2008-01-27 00:04:35:877000

說明這個時間是凌晨的 00:04 分,而不是中午的 12:04 分。

發生此問題的原因如下:

示例:

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 時間就會自動轉換成大家需要的格式了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章