oracle中函数TZ_OFFSET的返回数据类型是什么?
例如,
select tz_offset(DBTIMEZONE) from dual;
-04:00
答案 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
= WE8MSWIN1252
和NLS_NCHAR_CHARACTERSET
= AL16UTF16
的Oracle实例。
附录 - 后续问题询问如何将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
)
请注意,第三个SUBSTR
指定“从第5位开始的2个字符”(SUBSTR(..., 5, 2)
)。通常你会说“从位置5到字符串末尾”(SUBSTR(..., 5)
),但这将包括奇怪的尾随空字符(\0
,如DUMP
中所示),这将导致错误。
答案 1 :(得分:1)
至少JDBC驱动程序将其报告为VARCHAR(7)
根据价值,没有任何其他可能性。没有其他数据类型可以让你在不应用某些格式的情况下组合数字和前导零。
答案 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;