Oracle中的TIMESTAMP數(shù)據(jù)類(lèi)型很多人用的都很少,所以即使最簡(jiǎn)單的一個(gè)查詢(xún)返回的結(jié)果也會(huì)搞不清楚到底這個(gè)時(shí)間是什么時(shí)間點(diǎn)。
例如:
27-1月 -08 12.04.35.877000 上午
這個(gè)時(shí)間到底是幾點(diǎn)呢?中午12:04分,那就錯(cuò)了,其實(shí)使用to_char函數(shù)轉(zhuǎn)換后得到如下結(jié)果:
2008-01-27 00:04:35:877000
說(shuō)明這個(gè)時(shí)間是凌晨的00:04分,而不是中午的12:04分。
發(fā)生此問(wèn)題的原因如下:
示例:
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
首先把一個(gè)00:05分的時(shí)間進(jìn)行轉(zhuǎn)換,按照'yyyy-mm-dd hh:mi:ss am'格式進(jìn)行轉(zhuǎn)換,得到的結(jié)果是:
2008-01-29 12:05:10 上午
這說(shuō)明Oracle在進(jìn)行日期轉(zhuǎn)換成字符串的過(guò)程中,如果小時(shí)轉(zhuǎn)換使用的是12進(jìn)制的格式,則凌晨00點(diǎn)會(huì)被認(rèn)為是上午12點(diǎn),然后才是上午1點(diǎn)、2點(diǎn)、3點(diǎn)。。。
oracle中12進(jìn)制的計(jì)時(shí)不是從0-11,而是從1-12的,所以如果是夜里零點(diǎn),你不能記成1點(diǎn),那只能記成12點(diǎn)了。(不知道這是不是跟洋人的習(xí)慣有關(guān)?)
現(xiàn)在我們來(lái)看一下Oracle中對(duì)TIMESTAMP的處理:
SELECT VALUE FROM NLS_session_PARAMETERS WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT'
返回結(jié)果DD-MON-RR HH.MI.SSXFF AM,可以看到,這里默認(rèn)情況下,使用的TIMESTAMP的格式是12進(jìn)制的小時(shí)。
問(wèn)題到這里已經(jīng)找到根源了。
解決方法:
pl/sql developer中讀取的是注冊(cè)表中設(shè)置的NLS_TIMESTAMP_FORMAT格式,那么只要在注冊(cè)表中設(shè)置Oracle環(huán)境變量的地方(也就是設(shè)置ORACLE_HOME的地方)設(shè)置NLS_TIMESTAMP_FORMAT的格式(也就是創(chuàng)建這樣一個(gè)字符串項(xiàng),然后設(shè)置它的值為你轉(zhuǎn)換需要的掩碼,我一般設(shè)置為YYYY-MM-DD HH24:MI:SS:FF6),然后關(guān)掉PL/SQL DEVELOPER,再繼續(xù)登陸,以后我們看到的TIMESTAMP時(shí)間就會(huì)自動(dòng)轉(zhuǎn)換成大家需要的格式了。
新聞熱點(diǎn)
疑難解答
圖片精選