-1

我正在从 DB2/z 中的一个表中查询一些数据,该表保存每小时的数据,但偶尔会跳过几个小时(如果客户端不发送该小时的详细信息)。

由于我将数据直接输入到需要查询以获取轴数据的图表工具中,因此它有时会缺少时间轴上的值并且看起来很难看:

23.00 |===
22.00 |=====
14.00 |============
01.00 |==
00.00 |=
      +--------------------

我们已经禁止添加任何辅助表,例如保存所有时间的 24 行表,因此我需要在 DB2 中进行查询,该查询将返回一天中的所有时间,而无需可靠的后备表。我一直在使用可怕的:

select '00.00' from sysibm.sysdummy1
union all select '01.00' from sysibm.sysdummy1
union all select '02.00' from sysibm.sysdummy1
union all select '03.00' from sysibm.sysdummy1
: : :
union all select '23.00' from sysibm.sysdummy1
order by 1

这是我见过的最笨拙的解决方案,所以我宁愿有一些更清洁的东西。

我在下面发布了我自己的解决方案,但我愿意接受任何更简单或更优雅的方法。

4

2 回答 2

2

以下限制级别的递归调用将提供所需的范围,而无需后备表。如果没有级别限制,DB2 抱怨该函数可能是无限递归的。

with trange(lvl, tm) as (
    select 1, time('00:00') from sysibm.sysdummy1
    union all select lvl+1, tm + 1 hour from trange where lvl < 24
) select left(char(tm,iso),5) as hour from trange;

这给出了:

HOUR 
-----
00.00
01.00
02.00
03.00
: : :
22.00
23.00

如预期的。

于 2010-02-04T08:47:41.813 回答
0
VALUES '00.00', '01.00', /* ... */, '23.00'

应该也可以,至少对我来说(在 LUW 9.1+ 上)。:-) 仍然很笨拙,但更紧凑。

一般来说,我发现如果您不需要 的全部功能SELECT,并且不需要命名您的列,VALUES这是一个更简单的选择。

如果您确实想命名您的列,只需VALUES在 a 中添加SELECT

SELECT * FROM (VALUES /* ... */) AS foo (hour)

(对于某些版本的 DB2,这foo是可选的。)


哦,哇,我刚刚阅读了 DB2 z/OS 文档VALUES,与 LUW 版本相比,它要弱得多。对于 z/OS,VALUES只能在触发器的触发动作中使用。对不起,帕克斯迪亚布罗。:-(

于 2010-02-04T08:50:09.950 回答