oracle中函数TZ_OFFSET的返回数据类型是什么?
例如,
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
通常不是这种情况,但我仍然将其视为通用字符串类型。
这可能因字符集而异;我不确定。我上面运行的查询针对的是 NLS_CHARACTERSET
= WE8MSWIN1252
和 NLS_NCHAR_CHARACTERSET
= AL16UTF16
的 Oracle 实例。
附录 - 后续问题询问如何将 TZ_OFFSET
输出转换为数字。方法如下:
- 将小时部分转换为数字
- 将分钟部分转换为数字并除以 60
- 将两个值相加
- 处理偏移量的符号(+ 或 -)
注意:在意识到它不适用于包含分钟的负时区偏移后,我更新了此内容。例如,我的原始方程(现已删除)会将 -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
中所示),这将导致错误。
关于oracle - oracle中TZ_OFFSET函数的返回数据类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15903325/