在TZ_OFFSET()之后Oracle不连接

时间:2017-03-24 16:03:53

标签: oracle concatenation concat string-concatenation timezone-offset

执行TZ_OFFSET后的连接似乎没有注册。 例如:

SELECT '[' || TZ_OFFSET('Europe/Amsterdam') || ']' FROM DUAL

结果:

[+01:00

为什么TZ_OFFSET()之后的连接没有发生?

1 个答案:

答案 0 :(得分:3)

这似乎是一个错误(1937516,我看不到;也是9861391,它指的是基本错误17291158,我也看不到),结合客户端行为。在SQL * Plus或SQL Developer中,这看起来不错 - 有点像:

select '[' || tz_offset('Europe/Amsterdam') || ']' from dual;

'['||TZ_O
---------
[+01:00 ]

似乎是一个额外的空间;虽然从SQL Developer工作表中复制和粘贴它 - 就像那样显示 - 也会丢失结束括号:

'['||TZ_O
---------
[+01:00

转储生成的值会显示问题:

select dump('[' || tz_offset('Europe/Amsterdam') || ']') from dual;

DUMP('['||TZ_OFFSET('EUROPE/AMSTERDAM')||']')
---------------------------------------------
Typ=1 Len=9: 91,43,48,49,58,48,48,0,93

注意0字节,这是一个空字符,并引起混淆。

由于偏移格式是固定的,您可以通过简单的substr()

来避免这种情况
select '[' || substr(tz_offset('Europe/Amsterdam'), 1, 6) || ']' from dual;

'['||SUB
--------
[+01:00]

select dump('[' || substr(tz_offset('Europe/Amsterdam'), 1, 6) || ']') from dual;

DUMP('['||SUBSTR(TZ_OFFSET('EUROPE/AMSTERDAM'),1,6)||']')
---------------------------------------------------------
Typ=1 Len=8: 91,43,48,49,58,48,48,93

...或评论中提到的replace()trim()选项;或其他任何消除流氓性格的东西;甚至:

rtrim(tz_offset('Europe/Amsterdam'), chr(0))

由于在MoS中看不到错误,我不确定它何时(或是否)被修复。看起来它存在于11.2.0.0中,我看到了11.2.0.4中的内容 - 它可以在12c中修复。我在12.1.0.2中没有看到它。