2

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

例如,

select tz_offset(DBTIMEZONE) from dual;

-04:00

4

4 回答 4

8

看起来是这样的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-type 终止符。对于 a 通常不是这种情况,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
)

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

于 2013-04-09T13:46:14.963 回答
1

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

在此处输入图像描述

而且基于价值,没有其他的可能。没有其他数据类型可以让您在不应用某些格式的情况下组合数字和前导零。

于 2013-04-09T13:51:14.977 回答
1

关于什么:

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

将偏移量转换为数字?

于 2015-06-19T20:12:46.587 回答
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;
于 2016-05-27T19:39:39.677 回答