oracle中函数TZ_OFFSET的返回数据类型是什么?

sib*_*ani 2 oracle timezone timestamp return sqldatatypes

oracle中函数TZ_OFFSET的返回数据类型是什么?

例如,

select tz_offset(DBTIMEZONE) from dual;
Run Code Online (Sandbox Code Playgroud)

-04:00

Ed *_*bbs 7

它看起来像是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
Run Code Online (Sandbox Code Playgroud)

Typ=1指示VARCHAR2,但要注意,ASCII转储有,0结尾.这意味着该字符串具有一个\0-type终止符.通常情况并非如此,VARCHAR2但我仍然将其视为通用的字符串类型.

这可能因字符集而异; 我不确定.我上面运行的查询是针对带有NLS_CHARACTERSET= WE8MSWIN1252NLS_NCHAR_CHARACTERSET= 的Oracle实例AL16UTF16.


附录 - 后续问题询问如何将TZ_OFFSET输出转换为数字.这是如何做:

  1. 将小时部分转换为数字
  2. 将分钟部分转换为数字并除以60
  3. 将两个值一起添加
  4. 处理偏移的符号(+或 - )

注意:我在意识到它不适用于包含分钟的负时区偏移后更新了这个.例如,我的原始等式(现已删除)将转换-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
)
Run Code Online (Sandbox Code Playgroud)

请注意,第三个SUBSTR指定"从位置5开始的2个字符"(SUBSTR(..., 5, 2)).通常你会说"从位置5到字符串末尾"(SUBSTR(..., 5)),但是这将包括奇怪的尾随null-char(\0如中所示DUMP),这将导致错误.