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

时间:2013-04-09 13:30:13

标签: oracle timezone timestamp return sqldatatypes

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

例如,

select tz_offset(DBTIMEZONE) from dual;

-04:00

4 个答案:

答案 0 :(得分:6)

看起来像是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通常情况并非如此,但我仍然只是将其视为通用的字符串类型。

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


附录 - 后续问题询问如何将TZ_OFFSET输出转换为数字。方法如下:

  1. 将小时部分转换为数字
  2. 将分钟部分转换为数字并除以60
  3. 将两个值一起添加
  4. 处理偏移的符号(+或 - )
  5. 注意我在认识到它不适用于包含分钟的负时区偏移后更新了这个。例如,我的原始等式(现已删除)会将-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中所示),这将导致错误。

答案 1 :(得分:1)

至少JDBC驱动程序将其报告为VARCHAR(7)

enter image description here

根据价值,没有任何其他可能性。没有其他数据类型可以让你在不应用某些格式的情况下组合数字和前导零。

答案 2 :(得分:1)

怎么样:

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

将偏移量转换为数字?

答案 3 :(得分: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;