無法根據TZ_OFFSET的值進行資料訪問
今天碰到一個比較奇怪的現象,無法根據TZ_OFFSET函式的返回值,進行查詢。
TZ_OFFSET函式是Oracle根據時區名稱,返回時區與0時區相差的小時和分鐘數。
SQL> SELECT TZ_OFFSET('Asia/Shanghai') FROM DUAL;
TZ_OFFS
-------
+08:00
比如這個例子中,對於Asia/Shanghai這個時區,返回了+08:00,說明上海這是時區是東八區。
不過使用這個函式的時候也發現了一個奇怪的現象,比如再V$TIMEZONE_NAMES檢視中,包含了Oracle支援的所有時區名稱和時區簡稱,但是沒有辦法根據TZ_OFFSET的結果來反查這張表:
SQL> SELECT TZNAME, TZABBREV, TZ_OFFSET(TZNAME)
2 FROM V$TIMEZONE_NAMES
3 WHERE TZ_OFFSET(TZNAME) = '+08:00';
未選定行
剛剛已經查詢到時區為+08:00的時區了,為什麼指定時區的OFFSET卻找不到呢,莫非其中的字元+或:的全形和半形出了問題。
將上面的查詢結果直接複製過去,問題依舊,仍然無法查詢到結果。
嘗試模糊查詢:
SQL> SELECT TZNAME, TZABBREV, TZ_OFFSET(TZNAME)
2 FROM V$TIMEZONE_NAMES
3 WHERE TZ_OFFSET(TZNAME) LIKE '+08:00%';
TZNAME TZABBREV TZ_OFFS
---------------------------------------- ------------------------------ -------
Asia/Chongqing LMT +08:00
Asia/Chongqing LONT +08:00
Asia/Chongqing CST +08:00
.
.
.
ROC LMT +08:00
ROC CST +08:00
ROC CDT +08:00
Singapore LMT +08:00
Singapore SMT +08:00
Singapore MALT +08:00
Singapore JST +08:00
Singapore SGT +08:00
已選擇89行。
模糊匹配可以得到結果,而直接查詢卻無法得多結果,這說明TZ_OFFSET的返回值還包含了其他的字元。
觀察上面的結果也可以看到,根據字串型別的特點,+08:00後面應該還有1個不可見的字元,否則TZ_OFFSET這個列顯示的就不是TZ_OFFS而應該是TZ_OFF。
下面看看TZ_OFFSET返回結果的長度:
SQL> SELECT LENGTH(TZ_OFFSET('Asia/Shanghai')) FROM DUAL;
LENGTH(TZ_OFFSET('ASIA/SHANGHAI'))
----------------------------------
7
果然這裡包含了一個不可見的字元,透過DUMP來看看到底是什麼:
SQL> SELECT DUMP(TZ_OFFSET('Asia/Shanghai'), 16)
2 FROM DUAL;
DUMP(TZ_OFFSET('ASIA/SHANGHAI'),16)
-----------------------------------------------------------
Typ=1 Len=7: 2b,30,38,3a,30,30,0
居然是0,注意這個0不是數值0,而是ASCII碼0值,也就是C語句中字串的結束符“\0”。
在Oracle中這個值可以用CHR(0)來表示,於是上面的查詢可以改為:
SQL> SELECT TZNAME, TZABBREV, TZ_OFFSET(TZNAME)
2 FROM V$TIMEZONE_NAMES
3 WHERE TZ_OFFSET(TZNAME) = '+08:00' || CHR(0);
TZNAME TZABBREV TZ_OFFS
---------------------------------------- ------------------------------ -------
Asia/Chongqing LMT +08:00
Asia/Chongqing LONT +08:00
Asia/Chongqing CST +08:00
Asia/Chongqing CDT +08:00
.
.
.
Singapore MALT +08:00
Singapore JST +08:00
Singapore SGT +08:00
已選擇89行。
這裡來看一看TIMESTAMP型別的DUMP結果:
SQL> SELECT DUMP(TIMESTAMP '2009-3-8 20:57:32.23 +08:00', 16)
2 FROM DUAL;
DUMP(TIMESTAMP'2009-3-820:57:32.23+08:00',16)
-------------------------------------------------------------
Typ=188 Len=20: d9,7,3,8,c,39,20,0,80,85,b5,d,8,0,5,0,0,0,0,0
無論是在時區8的後面,還是在DUMP結果的最後,都有CHR(0)的存在,可能正式由於TIMESTAMP型別的特點,導致了TZ_OFFSET返回結果後面新增了一個CHR(0)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-563272/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript 根據物件鍵值進行排序JavaScript物件排序
- 二維陣列根據鍵的值進行排序陣列排序
- SpringMVC無法訪問根目錄的問題SpringMVC
- 基於Geomesa服務查詢軌跡資料無法根據空間和時間範圍進行查詢的問題解決辦法
- 資料庫VIP地址無法訪問(二)資料庫
- 資料庫VIP地址無法訪問(一)資料庫
- MSSQL遍歷資料庫根據列值查詢資料SQL資料庫
- 【shell】根據檔案時間有無更新進行報警
- update 修改資料時,依賴或者說需要根據另一個值來進行判斷l
- 根據陣列中物件進行排序陣列物件排序
- nginx 根據IP 進行灰度釋出Nginx
- derby 資料庫 伺服器模式 無法訪問資料庫伺服器模式
- github無法訪問Github
- 鬱悶~win7無法進行區域網訪問解決Win7
- 本機資料庫資料庫鏈無法訪問遠端資料庫資料庫
- 根據陣列的值刪除元素陣列
- win10QQ無法訪問個人資料夾解決辦法Win10
- onethink裡自己匯入新的資料表,無法進行運算元據表怎麼辦?
- 使用HttpURLConnection訪問介面進行資料處理HTTP
- WinPE無法訪問行動硬碟怎麼辦硬碟
- 二維陣列根據欄位進行排序陣列排序
- 新手發問 ! Laravel admin 根據ID判斷資料Laravel
- 根據時間欄位匯入資料的問題總結
- win10無法訪問win7共享資料夾的解決辦法Win10Win7
- git hub 無法訪問 訪問速度慢Git
- discuz資料庫搬家,改密碼後無法訪問解決辦法資料庫密碼
- GitHub無法訪問或訪問緩慢解決辦法Github
- 【伺服器資料恢復】infortrend儲存資料無法訪問的資料恢復案例伺服器資料恢復
- 無法訪問google picasa的解決辦法Go
- linux 無法訪問域名Linux
- 【原創】演示一個VPD進行資料訪問控制的示例
- 無法訪問網路上的芳鄰
- 資料夾損壞無法訪問. 不知道如何找到呢?
- zblog域名後無法訪問 zblog資料庫地址修改資料庫
- 重置資料庫密碼後導致網站無法訪問資料庫密碼網站
- Mysql利用Like支援根據匹配度進行查詢MySql
- 訪問github出現無法訪問此網站Github網站
- 寶塔皮膚修改埠號,無法訪問_寶塔修改埠後無法訪問