2012-05-23 24 views
3

我需要一個在oracle中執行這個序列的SINGLE查詢。在oracle中兩個日期之間按小時計數的記錄數

select count(*) from table1 
where request_time < timestamp'2012-05-19 12:00:00' and (end_time > timestamp'2012-05-19 12:00:00' or end_time=null); 

select count(*) from table1 
where request_time < timestamp'2012-05-19 13:00:00' and (end_time > timestamp'2012-05-19 13:00:00' or end_time=null); 

select count(*) from table1 
where request_time < timestamp'2012-05-19 14:00:00' and (end_time > timestamp'2012-05-19 14:00:00' or end_time=null); 

select count(*) table1 
where request_time < timestamp'2012-05-19 15:00:00' and (end_time > timestamp'2012-05-19 15:00:00' or end_time=null); 

select count(*) from table1 
where request_time < timestamp'2012-05-19 16:00:00' and (end_time > timestamp'2012-05-19 16:00:00' or end_time=null); 

正如你所看到的小時逐一增加。 這裏是輸出

COUNT(*)    
1085     

COUNT(*)    
1233     

COUNT(*)    
1407     

COUNT(*)    
1322     

COUNT(*)    
1237 

我寫了一個查詢,但它並沒有給我正確的答案!

select col1, count(*) from 
(select TO_CHAR(request_time, 'YYYY-MM-DD HH24') as col1 from table1 
where request_time <= timestamp'2012-05-19 12:00:00' and (end_time >= timestamp'2012-05-19 12:00:00' or end_time=null)) 
group by col1 order by col1; 

這個查詢給了我一個結果集,它的count(*)的總和等於上面寫的第一個查詢! 這裏是結果:

COL1   COUNT(*)    
------------- ---------------------- 
2012-05-19 07  22      
2012-05-19 08  141      
2012-05-19 09  322      
2012-05-19 10  318      
2012-05-19 11  282 

回答

14

請注意使用帶日期值的表達式trunc。如果您沒有在sql * plus中運行查詢,則可以省略alter session

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 

Session altered. 

SQL> SELECT 
     trunc(created,'HH'), 
     count(*) 
    FROM 
     test_table 
    WHERE 
     created > trunc(SYSDATE -2) 
    group by trunc(created,'HH'); 


TRUNC(CREATED,'HH') COUNT(*) 
------------------- ---------- 
2012-05-21 09:00:00  748 
2012-05-21 16:00:00   24 
2012-05-21 17:00:00   12 
2012-05-21 22:00:00  737 
2012-05-21 23:00:00  182 
2012-05-22 20:00:00   16 
2012-05-22 21:00:00  293 
2012-05-22 22:00:00  610 

8 ROWS selected. 
+0

謝謝,但這給了我同樣的結果,我已經寫了小組。問題是:我需要這個時間22:00:00,這在你的例子中是748 + 24 + 12 + 737 + 182 + 16 + 293 + 610 = 2622,而對於小時16:00:00它應該是748 + 24 = 772等等...... – Heidarzadeh

+0

我想我不理解你。 – ipip

+0

@Heidarzadeh:如果你正在討論總計COUNT(*)',試着用'count(*)'替換'sum(count(*))over(用trunc命令創建'HH' ))'。 –

1

您的個人查詢似乎匹配重疊的記錄集。如果你在你的問題中包含了一些示例數據,這將有所幫助,但我可以猜到...

例如,所有具有end_time = null和request_time = 2012-05-19 13:30:00的記錄將由第一次和第二次查詢計數;但它們只會在您的「整體」查詢中計數一次。

也許你打算在request_time的日期範圍內查詢,而不是像request_time < timestamp'2012-05-19 12:00:00'這樣的開放式謂詞?

+0

「將由兩個計數第一個和第二個查詢「是的,我需要這個。像斐波那契一樣!這個小時的計數是以前小時數+本小時數。 – Heidarzadeh

+0

我有兩個日期,我想計算兩個日期之間的查詢。那麼我想延長這個查詢來獲得日,月,甚至一年的結果! – Heidarzadeh

1

對於Oracle數據庫,其按預期工作。

SELECT TO_CHAR(更新, 'DD-MM-YYYY HH'), COUNT(*)FROM 客戶 WHERE TRUNC (更新)> = TO_CHAR('02 -JUL-2017' ) 和TRUNC(更新)< = TO_CHAR('02 -JUL-2017 ') 組由TO_CHAR(更新,' DD-MM-YYYY HH')

0

嘗試此

select TO_CHAR(request_time, 'HH24') as "hourOfDay",count(*)as 
"numOfLogin", TO_CHAR(request_time, 'DD') as "date" from table1 
where request_time<= timestamp'2017-08-04 23:59:59' and 
(request_time>= timestamp'2017-08-03 00:00:01') group by 
TO_CHAR(request_time, 'HH24'),TO_CHAR(request_time, 'DD'); 
相關問題