oracle中函數TZ_OFFSET的返回數據類型是什麼?oracle中函數TZ_OFFSET的返回數據類型是什麼?
例如,
select tz_offset(DBTIMEZONE) from dual;
-04:00
oracle中函數TZ_OFFSET的返回數據類型是什麼?oracle中函數TZ_OFFSET的返回數據類型是什麼?
例如,
select tz_offset(DBTIMEZONE) from dual;
-04:00
它看起來像它的VARCHAR2
:
SQL> SELECT TZ_OFFSET('UTC'), DUMP(TZ_OFFSET('UTC')) FROM DUAL;
TZ_OFFS DUMP(TZ_OFFSET('UTC'))
------- --------------------------------
+00:00 Typ=1 Len=7: 43,48,48,58,48,48,0
的Typ=1
表示VARCHAR2
,但要注意的是,ASCII轉儲有,0
在結束。這意味着該字符串有一個\0
型終止符。通常情況下,VARCHAR2
並不是這種情況,但我仍然會將其視爲通用字符串類型。
這可能因人物而異;我不確定。我上面運行的查詢是針對Oracle實例,其中NLS_CHARACTERSET
= WE8MSWIN1252
和NLS_NCHAR_CHARACTERSET
= AL16UTF16
。
附錄 - 後續問題問如何把TZ_OFFSET
輸出轉換成一個數字。具體方法如下:
注意:我意識到它不會爲負時區偏移量,包括分鐘工作崗位更新此。例如,我原來的等式(現在刪除)將會將-03:30
轉換爲-2.5
而不是-3.5
。
下面是完整的命令:
SIGN(TO_NUMBER(SUBSTR(TZ_OFFSET('whatever'), 1, 3))) * (
TO_NUMBER(SUBSTR(TZ_OFFSET('whatever'), 2, 2)) +
TO_NUMBER(SUBSTR(TZ_OFFSET('whatever'), 5, 2))/60
)
注意第三個SUBSTR
指定 「起始於位置5 2個字符」(SUBSTR(..., 5, 2)
)。通常情況下,你會說「從位置5到字符串末尾」(SUBSTR(..., 5)
),但那將包含奇怪的尾隨空字符(\0
,如DUMP
所示),這將導致錯誤。
至少爲VARCHAR(7)
並基於該值,沒有任何其他的可能性JDBC驅動程序報告它。沒有其他的數據類型可以讓你在不應用某些格式的情況下將數字和前導零結合起來。
什麼:
SUBSTR(TZ_OFFSET('whatever'), 1, 3) + SUBSTR(TZ_OFFSET('whatever'), 5, 2)/60
轉換的偏移量是多少?
儘管我覺得自己喜歡哈希,但我最終會在後端做這個子字符串魔術。但是我相信在DBMS中這樣做比在C#中排序更快!謝謝 – 2016-04-22 22:51:02
由於ed-gibbs表示看起來像VARCHAR2與\ 0在最後。這裏是如何尋找根據時區的時區名稱偏移
SELECT distinct tzname,SUBSTR(tz_offset(tzname),1,6) FROM V$TIMEZONE_NAMES WHERE SUBSTR(tz_offset(tzname),1,6) = '-04:00' order by tzname;
如果是VARCHAR2那麼爲什麼它不允許我使用「TO_NUMBER」功能更改數據類型號碼。 – sibimani 2013-04-09 14:00:59
其中一個原因是數字在其中沒有冒號。 – 2013-04-09 14:08:01
@DavidAldridge是正確的 - 冒號造成麻煩。我會在一分鐘內更新答案,向您展示如何將其更改爲小時數,如數字。 – 2013-04-09 14:10:37