2014-09-29 50 views
2
似乎組

我的查詢看起來是這樣的:「組按天」在Oracle不按日期

select datesent, count(*) the_count from receivedmessaged where status=5000 
and datesent>(to_date('20130101', 'YYYYMMDD')) group by datesent 

我正在尋找的是具有消息的計數和狀態的表每天5000個,比某個日期更新。我所得到的是一張一張地重複同一日期的表格。我認爲發生的事情是在該日期字段中存在隱藏時間部分,並且按照發送的準確時間對條目進行分組,而不是僅僅查看日期。任何人都可以證實這一點,並告訴我如何解決它?謝謝!

+0

從上面我們可以假設'datesent'列的類型是'date',因爲您將它與'to_date'函數的返回值進行比較。 'date'數據類型中沒有隱藏時間部分,但時間部分是該類型的重要部分。 – user272735 2014-09-30 08:41:40

回答

3

我認爲發生的事情是該datesent字段中存在隱藏時間部分,並且按照發送的確切時間對條目進行分組,而不僅僅是查看日期。

這很可能是發生了什麼事。所以嘗試:

select TRUNC(datesent), count(*) the_count from receivedmessaged where status=5000 
and datesent>(to_date('20130101', 'YYYYMMDD')) group by TRUNC(datesent) 

TRUNC將天去掉「部分時間」,讓你組。


請注意,使用TRUNC將無效您的索引。看看你的執行計劃。如果需要,您應該在TRUNC(datesend)上添加function-based index

+0

由於索引問題,我一直在試圖使用trunc之前大吼大叫。我認爲這樣會很好,因爲我只是在扼殺結果? – will 2014-09-29 18:11:14

+0

這似乎工作,順便說一句。 – will 2014-09-29 18:12:58

+0

我不知道如何索引你的表。但也許你應該考慮使用['基於函數的索引'](http://www.oracle-base.com/articles/8i/function-based-indexes.php)? – 2014-09-29 18:20:04

1

當然,使用TRUNC可以解決您的問題,使用function-based index可以使其更有效率。

但是,從11g起,也可以使用VIRTUAL colums。就你而言,你可以添加一個虛擬列爲new_date ALWAYS GENERATED AS (TRUNC(date_column))。你只需要在你的查詢中使用這個虛擬列。爲了提高性能,如果需要,您可以創建一個索引。

注意:根據虛擬列定義的索引等效於基於函數的索引。

+1

+1如果OP有權訪問/允許修改模式,那麼添加'VIRTUAL'列絕對是一個好主意。 – 2014-09-30 10:38:21

+0

是的,OP應該具有所需的權限。 – 2014-09-30 11:07:22