2016-11-29 8 views
0

私は日付と時刻のSQLデータベースを持っていますが、それらは単一の値(時間と呼ばれます)に結合されています。私は1時間ごとのエントリの数を決定したいと思いますが、これを行う方法を理解することはできません。私が行う場合 :Oracle SQLの日付から時刻を抽出するにはどうすればよいですか?

Select time from time_table 

私が得る結果は次のとおりです。

2016-05-13 07:23:23 
2016-05-13 07:34:34 
2016-05-14 07:21:00 
2016-05-14 09:42:43 

私が望む何のいずれかである:私は得るために並べ替えることができます

07:23:23 
07:34:34 
07:21:00 
09:42:43 

07:21:00 
07:23:23 
07:34:34 
09:42:43 

または、最終的には、私はリカウントを取得する:

07-08: 3 
08-09: 0 
09-10: 1 

これを実行する方法はありますか?

+0

質問しているデータベースに質問を付けてください。 –

+0

'time'カラムのデータ型は何ですか? – squillman

+0

[Oracle SQL DeveloperのDateTimeフィールドから時刻のみを抽出する方法は?](http://stackoverflow.com/questions/17104414/how-to-extract-only-time-from-a-datetime-field) -in-oracle-sql-developer) –

答えて

1

時刻は、その値の切り捨てを減算してDATEデータ型の値から抽出することができる。

select time - trunc(time) from..... 

これは分数を表し、分数、> = 0と< 1が返され1日の時間に変換するには:24を掛けます。

たとえば、今のところ私は現在〜8:08 pmです。その後、私は時間を知りたい場合は

select 24 * (sysdate - trunc(sysdate)) as result from dual; 

    RESULT 
---------- 
20.1566667 

はだから今、私は再びtrunc()を取ることができます。以前私は日付を切り捨てました。結果は数値で、数値を切り捨てます。 (最初の部分は0〜23の整数を生成します)すべて一緒にそれを置く

with h (hr) as (select level - 1 from dual connect by level <= 24) 
select h.hr, count(tt.time) as ct 
from h left outer join time_table tt on h.hr = trunc(24 * (tt.time - trunc(tt.time))) 
group by h.hr 
order by hr -- optional 
; 

私はポイントが表示されませんがあなたは、異なった「時間」列の書式を設定することができます。私の解決策はあなたが08-09を表示するところに8を表示します。両方とも同じ情報を持っています。

0

これはあなたがあなたの Counting number of records hour by hour between two dates in oracle

SELECT 
     trunc(time ,'HH'), 
     count(*) 
    FROM 
     time_table 
    WHERE 
     time > trunc(SYSDATE -2) 
    group by trunc(time ,'HH'); 

結果

2016年11月29日09から取られた問題解決するのに役立ちます:00:00.0を| 8 |

+0

このアプローチでは、別の日に09:15:00の時刻が異なる「1時間間隔」内にあるとみなします。営業担当者は、日付部分を破棄し、異なる日付からでも、午前7時から午前8時まで(例えば)まとめてカウントしたいと考えました。 – mathguy

+0

だから、午前7時から午前8時までのカウントを計算するには、「WHERE句」だけを削除してください。 TRUNCによって COUNT(*) FROM time_table グループ(DTIME、 'HH') TRUNC(DTIME、 'HH')を、SELECT 例えば、最終的なクエリは次のようになります。 –

1

2つのサブクエリを持つ1つのソリューションです.1つは時間の完全なリストを生成し、もう1つはターゲットテーブルの数値のリストを生成します。マッチすることなく何時間もカウントをゼロにするには、外部結合が必要です。

7-8,8-9などのバケットラベルには二重カウントが含まれていることに注意してください。そのため1時間の時間を無視しています。

SQL> select * from t42 
    2/

     ID TCOL 
---------- ------------------- 
     1 2016-05-13 07:23:23 
     2 2016-05-13 07:34:34 
     3 2016-05-14 07:21:00 
     4 2016-05-14 09:42:43 

SQL> with hrs as (select level-1 as hr 
    2    from dual 
    3    connect by level <= 24) 
    4  , t as (select to_number(to_char(tcol, 'HH24')) as hr 
    5    from t42) 
    6 select hrs.hr 
    7   , count(t.hr) 
    8 from hrs 
    9  left outer join t 
10  on hrs.hr = t.hr 
11 where hrs.hr between 7 and 9 
12 group by hrs.hr 
13 order by hrs.hr 
14/

     HR COUNT(T.HR) 
---------- ----------- 
     7   3 
     8   0 
     9   1 

SQL> 

この解決策では、time列がOracleの日付データ型であることを前提としています。それが文字列の場合は、最初に日付にキャストするか、substr()を適用すると動作します。

関連する問題