2013-04-09 3 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, но все же я бы рассматривал его как общий тип string-ish.

Это может отличаться от символов; Я не знаю точно. Запрос, который я использовал выше, был для экземпляра Oracle с NLS_CHARACTERSET = WE8MSWIN1252 и NLS_NCHAR_CHARACTERSET = AL16UTF16.


Добавление - Followup вопрос задают, как превратить TZ_OFFSET выход в ряд. Вот как:

  1. Преобразовать часть часов в число
  2. Преобразование минут части в число и разделить на 60
  3. Добавьте два значения вместе
  4. Deal со знаком смещения (в + или -)

ПРИМЕЧАНИЕ: Я обновил это после того, как понял, что она не будет работать для отрицательного смещения часового пояса, который включает в себя минуты. Например, мое исходное уравнение (теперь удалено) преобразует -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 определяет "2 символов, начиная с позиции 5" (SUBSTR(..., 5, 2)). Обычно вы говорите «от позиции 5 до конца строки» (SUBSTR(..., 5)), но это будет включать странный конечный нуль-char (\0, как видно из DUMP), что приведет к ошибке.

+0

Если это varchar2, то почему это не позволяет мне изменить номер типа данных с помощью функции «to_number». – sibimani

+0

Одной из причин было бы то, что число не содержит двоеточия. –

+0

@DavidAldridge прав - двоеточие вызывает проблемы. Я обновлю ответ за минуту, чтобы показать вам, как вы можете изменить его на количество часов, как числовое. –

1

По крайней мере, драйвер JDBC сообщает как VARCHAR(7)

enter image description here

И на основе значения, нет никакой другой возможности. Никакой другой тип данных не позволит вам комбинировать числа и ведущие нули без применения какого-либо форматирования.

1

насчет:

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

преобразовать смещение в ряд?

+0

Хотя я чувствую себя взломанным, я в конечном итоге сделаю эту магию подстроки в бэкэнде. Однако я верю, что делать это в СУБД намного быстрее, чем сортировать свой путь в моем C#! благодаря –

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; 
Смежные вопросы