Oracle时间表 - 填写缺失的时间

时间:2015-09-19 13:03:27

标签: oracle

我有一个查询,每分钟渲染一次(当分钟内有渲染时)

Shape

总渲染| ByMinute

NormalAutoFit

但是,即使没有渲染(在没有渲染时添加行... 09:22,09:26,09:29),我想要所有时间(按分钟)都有一行(

这样的事情

总渲染| ByMinute

select count(*) as "Total Rendered", to_char(r.request_dt, 'YYYY-MM-DD HH24:MI') as "ByMinute" from form_render r where r.form_type_id = 49 
and r.request_dt >= to_timestamp('09-16-2015 08:00', 'mm-dd-yyyy hh24:mi')
group by to_char(r.request_dt, 'YYYY-MM-DD HH24:MI')
order by to_char(r.request_dt, 'YYYY-MM-DD HH24:MI') desc

非常感谢任何帮助

肖恩

=============================================== ============================

9月20日尝试.....

=============================================== ============================

非常感谢你花时间把它放在一起。 SQL绝对不是我的力量,因为我相信你能分辨出来!

所以我将时间表和查询修补在一起,但收到错误(ORA01843:不是有效的月份。)

当我单独运行查询时

 19           2015-09-17 09:31
 10           2015-09-17 09:30
  1           2015-09-17 09:28
  6           2015-09-17 09:27
 18           2015-09-17 09:25
 22           2015-09-17 09:24
 12           2015-09-17 09:23
 13           2015-09-17 09:21
 22           2015-09-17 09:20

我得到以下

 19           2015-09-17 09:31
 10           2015-09-17 09:30
  0           2015-09-17 09:29
  1           2015-09-17 09:28
  6           2015-09-17 09:27
  0           2015-09-17 09:26
 18           2015-09-17 09:25
 22           2015-09-17 09:24
 12           2015-09-17 09:23
  0           2015-09-17 09:22
 13           2015-09-17 09:21
 22           2015-09-17 09:20

当我运行minute_table查询时

select count(*)as "Total_Rendered" , to_char(r.request_dt, 'MM/DD/YYYY HH24:MI')as "ByMinute" from form_render r where r.form_type_id = 49 
and r.request_dt >= to_timestamp('09/17/2015 09:11', 'mm/dd/yyyy hh24:mi') and r.request_dt <= to_timestamp('09/17/2015 09:18', 'mm/dd/yyyy hh24:mi')
group by to_char(r.request_dt, 'MM/DD/YYYY HH24:MI')
order by 2 desc

我得到以下内容....

TOTAL_RENDERED |  ByMinute
---------------------------
4               |  09/17/2015 09:18
16              |  09/17/2015 09:17
4               |  09/17/2015 09:16
2               |  09/17/2015 09:11

到目前为止一切顺利。

当我合并两个查询以获取此查询时

WITH   min_date AS /* replace start and stop timestamp here */
   (SELECT to_date('09/17/2015 09:11', 'MM/DD/YYYY hh24:mi') minute FROM dual
   ),
 max_date AS
   (SELECT to_date('09/17/2015 09:18', 'MM/DD/YYYY hh24:mi') minute FROM dual
   ),  
 minute_table AS
   (SELECT
          (SELECT minute FROM min_date
     ) + (rownum -1)/(24*60) AS by_minute
   FROM dual
     CONNECT BY level <=
     (SELECT (24*60) *(
       (SELECT minute FROM max_date
       ) -
       (SELECT minute FROM min_date
       ))+1
     FROM dual
     )
   )
select * from minute_table

我收到错误ORA01843:不是有效月份。

我不完全确定错误发生的原因但我相信它与我加入的列之间的格式差异有关?  时间表和我的表格中的日期格式可能是原因,但我不确定。

时间表有9/17/2015 9:11:00 AM和  我的查询已于09/17/2015 09:11(通知在月,秒和AM上缺少前导零)

感谢任何帮助。

再次感谢您的时间和专业知识....  肖恩

2 个答案:

答案 0 :(得分:1)

所以这在Oracle 12c中有效。但你必须改变它以供你使用。

           with tbl(Total_Rendered, ByMinute) as (
                  select 19,to_date('2015-09-17 09:31','YYYY-MM-DD HH24:MI') from dual union all
                   select 1,to_date('2015-09-17 09:30','YYYY-MM-DD HH24:MI') from dual union all
                   select 19,to_date('2015-09-17 09:28','YYYY-MM-DD HH24:MI') from dual )

          select nvl(tbl.total_rendered,'0') as total_rendered,by_minute from              
                    (select to_date('2015-09-17 09:28','YYYY-MM-DD HH24:MI') + (1/24/60) * column_value as by_minute from 
                    TABLE(  CAST( MULTISET( SELECT LEVEL FROM   DUAL
                                        CONNECT BY LEVEL <= 3 ) AS SYS.ODCINUMBERLIST
                              ) )) time_range
                    left outer join
                       tbl
                              on tbl.ByMinute = time_range.by_minute

输出

        TOTAL_RENDERED BY_MINUTE
        0   17-SEP-2015 09:29:00
        1   17-SEP-2015 09:30:00
        19  17-SEP-2015 09:31:00

我所做的首先是使用临时表tbl,它将数据作为输入。然后我生成时间戳来自&#39; 17-SEP-2015 09:29:00&#39; - &#39; 17-SEP-2015 09:31:00&#39;生成time_range

现在我从这个time_range到tbl做了一个左外连接,它缺少数据。对于不在tbl中的行,我打印0。

您可以使用此查询并对其进行编辑以获取time_range并加入您的数据以获得此输出。

答案 1 :(得分:1)

稍微不同的解决方案,不依赖于12c和&#34;参数&#34;开始和停止分钟。

IEnumerable