首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle -列出每个月的每一天的小时数

Oracle -列出每个月的每一天的小时数
EN

Stack Overflow用户
提问于 2020-08-28 16:42:43
回答 2查看 71关注 0票数 1

我做了一些仪表盘,我发现我没有任何表格,包括我需要的所有日期。我的子查询是按日期(DD.MM,YYYY)和小时(HH24)连接的。然而,我被模板卡住了。

我列出了一个月中的所有日子,通过

代码语言:javascript
运行
复制
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')

,还列出了一天中的所有时间。

代码语言:javascript
运行
复制
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天的时间,它可以工作……

代码语言:javascript
运行
复制
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行,所以这应该不是问题。

谢谢你们的建议

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-28 17:27:21

对我来说,它看起来就像

代码语言:javascript
运行
复制
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.
票数 0
EN

Stack Overflow用户

发布于 2020-08-28 16:48:01

如果您想生成当月的所有小时数,您可以这样做:

代码语言:javascript
运行
复制
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   

我们可以通过分别生成日期和小时,然后交叉连接它们来减少迭代次数:

代码语言:javascript
运行
复制
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 h
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63630385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档