2016-11-29 53 views
0

我有一個日期和時間的SQL數據庫,但他們被合併成一個單一的值(稱爲時間)。我想確定每小時的條目數量,但我無法弄清楚如何做到這一點。 如果我做的:如何從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 

有沒有什麼辦法可以做到這一點?

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

這將返回一個分數,> = 0和< 1,表示級分:

+0

請用你使用的數據庫標記你的問題。 –

+0

「時間」列的數據類型是什麼? – 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數據類型的值減去該值的截斷被提取一天。將其轉換爲小時:乘以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 
; 

您可以採用不同的格式「小時」欄目,雖然我不明白這一點;我的解決方案將顯示8您在哪裏顯示08-09。兩者都有相同的信息。

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視爲落入不同的「一小時間隔」內。 OP特別想要放棄日期部分,並將上午7點到上午8點之間的所有內容(例如)統一在一起,即使是在不同的日期。 – mathguy

+0

所以爲了計算從上午7點到上午8點之間的所有事情,甚至是從不同的日期開始,只需刪除「WHERE子句」即可。 e.g最終的查詢會是這樣 SELECT TRUNC(DTIME, 'HH'), COUNT(*)FROM time_table 組由TRUNC(DTIME, 'HH'); –

1

下面是一個帶有兩個子查詢的解決方案,一個用於生成完整的小時數列表,另一個用於生成目標表中的數字列表。需要外連接才能在沒有匹配的情況下產生零小時計數。

請注意,水桶標籤如7-8,8-9意味着雙重計數,所以我忽略了這一點,以支持單個小時。

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> 

此解決方案假定時間列是Oracle日期數據類型。如果它是一個字符串,那麼將它投射到第一個日期或應用substr()將工作。

相關問題