Что такое возвращаемый тип данных для функции TZ_OFFSET в oracle ??Каков возвращаемый тип данных для функции TZ_OFFSET в oracle?
Например,
select tz_offset(DBTIMEZONE) from dual;
-04: 00
Что такое возвращаемый тип данных для функции TZ_OFFSET в oracle ??Каков возвращаемый тип данных для функции TZ_OFFSET в oracle?
Например,
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
, но все же я бы рассматривал его как общий тип string-ish.
Это может отличаться от символов; Я не знаю точно. Запрос, который я использовал выше, был для экземпляра Oracle с NLS_CHARACTERSET
= WE8MSWIN1252
и NLS_NCHAR_CHARACTERSET
= AL16UTF16
.
Добавление - Followup вопрос задают, как превратить 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
определяет "2 символов, начиная с позиции 5" (SUBSTR(..., 5, 2)
). Обычно вы говорите «от позиции 5 до конца строки» (SUBSTR(..., 5)
), но это будет включать странный конечный нуль-char (\0
, как видно из DUMP
), что приведет к ошибке.
По крайней мере, драйвер JDBC сообщает как VARCHAR(7)
И на основе значения, нет никакой другой возможности. Никакой другой тип данных не позволит вам комбинировать числа и ведущие нули без применения какого-либо форматирования.
насчет:
SUBSTR(TZ_OFFSET('whatever'), 1, 3) + SUBSTR(TZ_OFFSET('whatever'), 5, 2)/60
преобразовать смещение в ряд?
Хотя я чувствую себя взломанным, я в конечном итоге сделаю эту магию подстроки в бэкэнде. Однако я верю, что делать это в СУБД намного быстрее, чем сортировать свой путь в моем C#! благодаря –
Как 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
Одной из причин было бы то, что число не содержит двоеточия. –
@DavidAldridge прав - двоеточие вызывает проблемы. Я обновлю ответ за минуту, чтобы показать вам, как вы можете изменить его на количество часов, как числовое. –