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
它看起来像是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
= WE8MSWIN1252
和NLS_NCHAR_CHARACTERSET
= 的Oracle实例AL16UTF16
.
附录 - 后续问题询问如何将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
)
Run Code Online (Sandbox Code Playgroud)
请注意,第三个SUBSTR
指定"从位置5开始的2个字符"(SUBSTR(..., 5, 2)
).通常你会说"从位置5到字符串末尾"(SUBSTR(..., 5)
),但是这将包括奇怪的尾随null-char(\0
如中所示DUMP
),这将导致错误.