2013-04-09 367 views

回答

5

它看起来像它的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 = WE8MSWIN1252NLS_NCHAR_CHARACTERSET = AL16UTF16


附录 - 后续问题问如何把TZ_OFFSET输出转换成一个数字。具体方法如下:

  1. 转换的时间部分成数
  2. 转换分钟部成多个并除以与所述偏移量的符号(添加两个值一起
  3. 交易+或 - )

注意我意识到它不会为负时区偏移量,包括分钟工作岗位更新此。例如,我原来的等式(现在删除)将会将-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所示),这将导致错误。

+0

如果是VARCHAR2那么为什么它不允许我使用“TO_NUMBER”功能更改数据类型号码。 – sibimani 2013-04-09 14:00:59

+0

其中一个原因是数字在其中没有冒号。 – 2013-04-09 14:08:01

+0

@DavidAldridge是正确的 - 冒号造成麻烦。我会在一分钟内更新答案,向您展示如何将其更改为小时数,如数字。 – 2013-04-09 14:10:37

1

至少为VARCHAR(7)

enter image description here

并基于该值,没有任何其他的可能性JDBC驱动程序报告它。没有其他的数据类型可以让你在不应用某些格式的情况下将数字和前导零结合起来。

1

什么:

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

转换的偏移量是多少?

+0

尽管我觉得自己喜欢哈希,但我最终会在后端做这个子字符串魔术。但是我相信在DBMS中这样做比在C#中排序更快!谢谢 – 2016-04-22 22:51:02

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; 
相关问题