6

Oracleでこのシーケンスを実行するSINGLEクエリが必要です。

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);

ご覧のとおり、時間は1つずつ増えています。これが出力です

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  
4

5 に答える 5

24

trunc日付値を使用した式の使用法に注意してください。alter sessionsql * plusでクエリを実行していない場合は、を省略できます。

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.
于 2012-05-23T11:07:37.750 に答える
1

個々のクエリは、重複するレコードのセットと一致しているようです。質問にサンプルデータを含めると役に立ちますが、推測できます...

たとえば、end_time=nullおよびrequest_time=2012-05-19 13:30:00を持つすべてのレコードは、最初のクエリと2番目のクエリの両方でカウントされます。ただし、「全体」クエリでは1回だけカウントされます。

request_time < timestamp'2012-05-19 12:00:00'たぶん、 ?のようなオープンエンドの述語を使用する代わりに、request_timeの日付範囲でクエリを実行するつもりでした。

于 2012-05-23T07:05:43.543 に答える
1

Oracleデータベースの場合、期待どおりに機能します。

SELECT to_char(updated、'DD-MM-YYYY HH')、count(*)FROM customer WHERE trunc(updated)> = to_Char('02 -JUL-2017')And trunc(updated)<= to_Char('02- JUL-2017')to_charによるグループ(更新、' DD-MM-YYYY HH')

于 2017-07-03T16:45:08.893 に答える
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');
于 2017-08-04T14:04:33.153 に答える
0

私はあなたがやろうとしていたのと同じことをしなければなりませんでした。これが私が思いついたロジックです

select count(0), hours
from
(select to_char(from_date + ((to_number(column_value)-1)/24), 'yyyy-mm-dd hh24')||':00:00' hours
  from table1,
       xmltable ('for $i in 1 to xs:int(.) return $i'
                 passing xmlelement(e, extract (hour from cast(to_date as timestamp)-cast(from_date as timestamp))+2))
where change_date > sysdate - 1
)
group by hours
order by count(0) desc;
于 2021-12-16T01:26:51.143 に答える