代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

在没有支持表的情况下,在DB2中检索一天中所有时间(1小时的分辨率)的优雅方法是什么?

  •  0
  • paxdiablo  · 技术社区  · 15 年前

    我从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
    

    这几乎是我见过的一种解决方案,所以我想买些更干净的。

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   paxdiablo    15 年前

    以下级别的有限递归调用将提供所需的范围,而不提供支持表。如果不限制级别,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
    

    根据需要。

        2
  •  0
  •   C. K. Young    15 年前
    VALUES '00.00', '01.00', /* ... */, '23.00'
    

    也应该工作,至少对我来说(在luw 9.1+上)。:-)仍然笨拙,但更紧凑。

    总的来说,我发现如果你不需要 SELECT 不需要命名列, VALUES 是一个简单得多的选择。

    如果您想命名您的列,只需将 价值观 在一个 选择 以下内容:

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

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


    噢,哇,我刚刚阅读了DB2z/OS文档 价值观 与luw版本相比,它更弱。对于Z/OS, 价值观 只能在触发器的已触发操作中使用。对不起,帕西迪亚布洛。: