我做了一些仪表盘,我发现我没有任何表格,包括我需要的所有日期。我的子查询是按日期(DD.MM,YYYY)和小时(HH24)连接的。然而,我被模板卡住了。
我列出了一个月中的所有日子,通过
select to_date('1.' || to_CHAR(sysdate, 'MM.YYYY'), 'dd.mm.yyyy') + level - 1 as month
from dual
connect by level <= TO_CHAR(LAST_DAY(sysdate), 'DD'),还列出了一天中的所有时间。
select to_date(to_char(sysdate, 'DD.MM.YYYY'), 'dd.mm.yyyy') + 1 / 24*(level - 1)
from dual
connect by level <= 24当我将它与每月的rownum =1组合在一起时,我只有1天的时间,它可以工作……
select to_date(to_char(mesic, 'DD.MM.YYYY'), 'dd.mm.yyyy') + 1 / 24*(level - 1)
from
(select *
from (select to_date('1.' || to_CHAR(sysdate, 'MM.YYYY'), 'dd.mm.yyyy') + level - 1 as mesic
from dual
connect by level <= TO_CHAR(LAST_DAY(sysdate), 'DD'))
where rownum = 1)
connect by level <= 24然而,当我删除rownum条件时,我得到了错误,我得到了最大行数。
根据我的逻辑,它应该是24 (小时)*31(当月天数)= 744。我的临时仪表板报告通常有5000行,所以这应该不是问题。
谢谢你们的建议
发布于 2020-08-28 17:27:21
对我来说,它看起来就像
select trunc(sysdate, 'mm') + (level - 1) / 24 datum
from dual
connect by level <= (add_months(trunc(sysdate, 'mm'), 1) - trunc(sysdate, 'mm')) * 24;
DATUM
----------------
01.08.2020 00:00
01.08.2020 01:00
01.08.2020 02:00
<snip>
31.08.2020 21:00
31.08.2020 22:00
31.08.2020 23:00
744 rows selected.发布于 2020-08-28 16:48:01
如果您想生成当月的所有小时数,您可以这样做:
with cte (dt) as (
select trunc(sysdate, 'month') from dual
union all
select dt + interval '1' hour
from cte
where dt + interval '1' hour < trunc(sysdate, 'month') + interval '1' month
)
select * from cte 我们可以通过分别生成日期和小时,然后交叉连接它们来减少迭代次数:
with
days (dy) as (
select trunc(sysdate, 'month') from dual
union all
select dy + interval '1' day
from days
where dy + interval '1' day < trunc(sysdate, 'month') + interval '1' month
),
hours (hh) as (
select 0 from dual
union all
select hh + 1 from hours where hh < 23
)
select d.dy + h.hh * interval '1' hour dt
from days d
cross join hours hhttps://stackoverflow.com/questions/63630385
复制相似问题