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

Oracle时间表-填写缺失的时间,oracle,Oracle,我有一个查询,当每分钟有一个渲染时,它会为我提供每分钟的渲染 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')

我有一个查询,当每分钟有一个渲染时,它会为我提供每分钟的渲染

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
总渲染时间(按分钟) 但是,我希望所有时间都按分钟显示一行,即使在没有渲染的情况下也是如此。在没有渲染的情况下添加行…09:22,09:26,09:29

像这样的

总渲染时间(按分钟) 非常感谢您的帮助

肖恩

=========================================================================== 9月20日尝试。。。。。 ===========================================================================


非常感谢您抽出时间来整理这些内容。SQL绝对不是我的强项,我相信你会知道的

因此,我将时间表和我的查询拼凑在一起,但得到一个错误ORA01843:不是有效月份

当我自己运行查询时

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
当我运行minute_表查询时

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
到目前为止还不错

当我组合这两个查询以获得此查询时

WITH   min_date AS /* replace start and stop timestamp here */
   (SELECT to_date('09/17/2015 09:11', 'MM/DD/YYYY hh24:mi:ss') minute FROM dual
   ),
 max_date AS
   (SELECT to_date('09/17/2015 09:18', 'MM/DD/YYYY hh24:mi:ss') 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
     )
   ),
 tbl AS
   (
   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
   )
 SELECT minute_table.by_minute ,
   NVL(tbl."Total_Rendered",'0') AS total_rendered
 FROM minute_table
 left OUTER JOIN tbl
 ON tbl."ByMinute" = minute_table.by_minute 
 order by 1 desc
 ;
我收到错误ORA01843:不是有效月份

我不完全确定为什么会发生错误,但我相信这与我加入的专栏之间的格式差异有关? 时间表和我的表格中日期的格式可能是原因,但我不确定

时间表为2015年9月17日上午9:11:00和 我的查询有2015年9月17日09:11通知,月、秒和上午缺少前导零

感谢您的帮助

再次感谢您的时间和专业知识。。。。
Sean

这是在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
我所做的是首先我使用一个临时表tbl,它将有数据作为您的输入。然后我从“2015年9月17日09:29:00”-“2015年9月17日09:31:00”生成时间戳,以生成时间范围

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


您可以使用此查询并对其进行编辑以获取时间范围,并与您的数据结合以获取此输出。

稍微不同的解决方案,不依赖于12c,并且具有启动和停止分钟的参数

 WITH   min_date AS /* replace start and stop timestamp here */
   (SELECT to_date('2015-09-17 09:28','yyyy-mm-dd hh24:mi') minute FROM dual
   ),
 max_date AS
   (SELECT to_date('2015-09-17 09:31','yyyy-mm-dd 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
     )
   ),
 tbl AS
   (SELECT 19 Total_Rendered,
     to_date('2015-09-17 09:31','YYYY-MM-DD HH24:MI') By_Minute
   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 minute_table.by_minute ,
   NVL(tbl.total_rendered,'0') AS total_rendered
 FROM minute_table
 LEFT OUTER JOIN tbl
 ON tbl.By_Minute = minute_table.by_minute 
 ;

Oracle为此提供了分区联接功能。只有当从外部联接表中选择了其他列时,分区联接才有帮助,在这种情况下,您没有任何分区依据。很抱歉,昨天大部分时间处于脱机状态。Oracle版本10g。非常感谢您花时间将其整合在一起。SQL绝对不是我的强项,我相信你会知道的!
9/17/2015 9:11:00 AM
9/17/2015 9:12:00 AM
9/17/2015 9:13:00 AM
9/17/2015 9:14:00 AM
9/17/2015 9:15:00 AM
9/17/2015 9:16:00 AM
9/17/2015 9:17:00 AM
9/17/2015 9:18:00 AM
WITH   min_date AS /* replace start and stop timestamp here */
   (SELECT to_date('09/17/2015 09:11', 'MM/DD/YYYY hh24:mi:ss') minute FROM dual
   ),
 max_date AS
   (SELECT to_date('09/17/2015 09:18', 'MM/DD/YYYY hh24:mi:ss') 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
     )
   ),
 tbl AS
   (
   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
   )
 SELECT minute_table.by_minute ,
   NVL(tbl."Total_Rendered",'0') AS total_rendered
 FROM minute_table
 left OUTER JOIN tbl
 ON tbl."ByMinute" = minute_table.by_minute 
 order by 1 desc
 ;
           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
 WITH   min_date AS /* replace start and stop timestamp here */
   (SELECT to_date('2015-09-17 09:28','yyyy-mm-dd hh24:mi') minute FROM dual
   ),
 max_date AS
   (SELECT to_date('2015-09-17 09:31','yyyy-mm-dd 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
     )
   ),
 tbl AS
   (SELECT 19 Total_Rendered,
     to_date('2015-09-17 09:31','YYYY-MM-DD HH24:MI') By_Minute
   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 minute_table.by_minute ,
   NVL(tbl.total_rendered,'0') AS total_rendered
 FROM minute_table
 LEFT OUTER JOIN tbl
 ON tbl.By_Minute = minute_table.by_minute 
 ;