oracle中函数TZ_OFFSET的返回数据类型是什么?oracle中函数TZ_OFFSET的返回数据类型是什么?
例如,
select tz_offset(DBTIMEZONE) from dual;
-04:00
oracle中函数TZ_OFFSET的返回数据类型是什么?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
并不是这种情况,但我仍然会将其视为通用字符串类型。
这可能因人物而异;我不确定。我上面运行的查询是针对Oracle实例,其中NLS_CHARACTERSET
= WE8MSWIN1252
和NLS_NCHAR_CHARACTERSET
= 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
)
注意第三个SUBSTR
指定 “起始于位置5 2个字符”(SUBSTR(..., 5, 2)
)。通常情况下,你会说“从位置5到字符串末尾”(SUBSTR(..., 5)
),但那将包含奇怪的尾随空字符(\0
,如DUMP
所示),这将导致错误。
至少为VARCHAR(7)
并基于该值,没有任何其他的可能性JDBC驱动程序报告它。没有其他的数据类型可以让你在不应用某些格式的情况下将数字和前导零结合起来。
什么:
SUBSTR(TZ_OFFSET('whatever'), 1, 3) + SUBSTR(TZ_OFFSET('whatever'), 5, 2)/60
转换的偏移量是多少?
尽管我觉得自己喜欢哈希,但我最终会在后端做这个子字符串魔术。但是我相信在DBMS中这样做比在C#中排序更快!谢谢 – 2016-04-22 22:51:02
由于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;
如果是VARCHAR2那么为什么它不允许我使用“TO_NUMBER”功能更改数据类型号码。 – sibimani 2013-04-09 14:00:59
其中一个原因是数字在其中没有冒号。 – 2013-04-09 14:08:01
@DavidAldridge是正确的 - 冒号造成麻烦。我会在一分钟内更新答案,向您展示如何将其更改为小时数,如数字。 – 2013-04-09 14:10:37