2013-04-09 373 views

回答

5

它看起來像它的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 = WE8MSWIN1252NLS_NCHAR_CHARACTERSET = AL16UTF16


附錄 - 後續問題問如何把TZ_OFFSET輸出轉換成一個數字。具體方法如下:

  1. 轉換的時間部分成數
  2. 轉換分鐘部成多個併除以與所述偏移量的符號(添加兩個值一起
  3. 交易+或 - )

注意我意識到它不會爲負時區偏移量,包括分鐘工作崗位更新此。例如,我原來的等式(現在刪除)將會將-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所示),這將導致錯誤。

+0

如果是VARCHAR2那麼爲什麼它不允許我使用「TO_NUMBER」功能更改數據類型號碼。 – sibimani 2013-04-09 14:00:59

+0

其中一個原因是數字在其中沒有冒號。 – 2013-04-09 14:08:01

+0

@DavidAldridge是正確的 - 冒號造成麻煩。我會在一分鐘內更新答案,向您展示如何將其更改爲小時數,如數字。 – 2013-04-09 14:10:37

1

至少爲VARCHAR(7)

enter image description here

並基於該值,沒有任何其他的可能性JDBC驅動程序報告它。沒有其他的數據類型可以讓你在不應用某些格式的情況下將數字和前導零結合起來。

1

什麼:

SUBSTR(TZ_OFFSET('whatever'), 1, 3) + SUBSTR(TZ_OFFSET('whatever'), 5, 2)/60 

轉換的偏移量是多少?

+0

儘管我覺得自己喜歡哈希,但我最終會在後端做這個子字符串魔術。但是我相信在DBMS中這樣做比在C#中排序更快!謝謝 – 2016-04-22 22:51:02

1

由於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; 
相關問題