【问题标题】:Oracle doesn't concatenate after TZ_OFFSET()Oracle 在 TZ_OFFSET() 之后没有连接
【发布时间】:2017-03-24 16:03:52
【问题描述】:

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

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

结果:

[+01:00

为什么在 TZ_OFFSET() 之后没有发生串联?

【问题讨论】:

  • 为我工作 - rextester.com/DMQSU85214
  • 这很奇怪,它不适合我 - snag.gy/wigrFJ.jpg
  • 即使在这里正常工作 - rextester.com/ESB48246 不确定是什么导致了你的问题。
  • 这可能是您的 Oracle 版本中的错误。你运行的是什么版本? (您可以通过运行SELECT VERSION FROM v$instance; 进行检查)
  • 嗯,这对我在 11.2.0.4 SE 上不起作用。即使使用 sub_query 或 CTE。很有趣。

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


【解决方案1】:

这似乎是一个错误(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

... 或 cmets 中提到的 replace()trim() 选项;或任何其他消除流氓角色的东西;甚至:

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

由于这些错误在 MoS 中不可见,我不确定它何时(或是否)得到修复。看起来它存在于 11.2.0.0 中,我在 11.2.0.4 中看到了东西 - 它可能在 12c 中修复。我在 12.1.0.2 中没有看到它。

【讨论】:

  • replace(problem_string, chr(0), null) - 长度无关方式
  • 在这种情况下,长度始终为 6(或 7,包括空字节),但是是的......
  • 我用TRIM(TRAILING CHR(0) FROM TZ_OFFSET('Europe/Amsterdam'))
猜你喜欢
  • 2018-03-08
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多