無法根據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物件排序
- 二維陣列根據鍵的值進行排序陣列排序
- 基於Geomesa服務查詢軌跡資料無法根據空間和時間範圍進行查詢的問題解決辦法
- Java根據前端返回的欄位名進行查詢資料Java前端
- MSSQL遍歷資料庫根據列值查詢資料SQL資料庫
- Java根據前端返回的欄位名進行查詢資料的方法Java前端
- update 修改資料時,依賴或者說需要根據另一個值來進行判斷l
- derby 資料庫 伺服器模式 無法訪問資料庫伺服器模式
- github無法訪問Github
- zblog域名後無法訪問 zblog資料庫地址修改資料庫
- onethink裡自己匯入新的資料表,無法進行運算元據表怎麼辦?
- 新手發問 ! Laravel admin 根據ID判斷資料Laravel
- 教你如何進行SSH無密碼訪問密碼
- springboot新增靜態資源無法訪問Spring Boot
- git hub 無法訪問 訪問速度慢Git
- win10無法訪問win7共享資料夾的解決辦法Win10Win7
- 根據陣列的值刪除元素陣列
- discuz資料庫搬家,改密碼後無法訪問解決辦法資料庫密碼
- 【伺服器資料恢復】infortrend儲存資料無法訪問的資料恢復案例伺服器資料恢復
- 二維陣列根據欄位進行排序陣列排序
- 本地站點無法訪問
- laravel-admin 無法訪問Laravel
- 重置資料庫密碼後導致網站無法訪問資料庫密碼網站
- 資料夾損壞無法訪問. 不知道如何找到呢?
- 訪問github出現無法訪問此網站Github網站
- python根據字典內的值實現排序Python排序
- 基於角色的訪問控制並根據不同的場景顯示不同的反饋資訊
- 寶塔皮膚修改埠號,無法訪問_寶塔修改埠後無法訪問
- 電腦無法開機系統無法啟動,如何進行資料恢復?資料恢復
- win10無法訪問smb共享資料夾的具體修復方法Win10
- win10系統下共享資料夾無法訪問的解決方法Win10
- Mysql利用Like支援根據匹配度進行查詢MySql
- es針對nested型別資料無法進行過濾查詢的問題記錄型別
- Classy:根據資料庫表在執行時建立類/模型資料庫模型
- 無法訪問請求的頁面,因為該頁的相關配置資料無效問題的解決
- linux 中根據檔案的大小進行檔案的查詢Linux
- springmvc寫了方法無法訪問SpringMVC
- 無法正常訪問伺服器伺服器
- 解決 Windows 無法訪問共享Windows