2016-04-13 37 views
0
select count(*) as a 
    from event 
    where eventName='ARTICLE' 
    and to_char(event_date,'DD-MM-YYYY')= '08-04-2016'; 

我想比較使用特定日期格式的日期,但是當我運行此查詢時,它花費了大量的時間。有什麼方法可以用最短的時間得到相同的結果?如何在不使用to_date/to_char函數的情況下比較oracle sql中的日期?

+2

你爲什麼要在'event_date'上做'to_char',我猜測它是'date'而不是在字符串上做'to_date'?你是否試圖強制將event_date的時間部分設置爲午夜?哪些索引可用?是'event_date'索引?表中定義了哪些索引? –

+0

我想你想整整一天。嘗試:'select count(*)as from event where eventName ='ARTICLE' and event_date between_date('08-04-2016','dd-mm-yyyy')and to_date('09 -04- 2016','dd-mm-yyyy')' – dcieslak

+0

請發佈您的表格結構(包括索引)和您的查詢的解釋計劃 – Aleksej

回答

1

您是否有EVENT_DATE的索引?如果你不這樣做,那麼你已經有了一個全表掃描,並且沒有建立一個索引就可以達到它的速度。

如果您確實有索引,您的查詢將不會使用它,因爲to_char()將禁用它。假設你的表格有足夠的不同日期,並且它們足夠結合在一起,以便使用索引值得使用。您可以通過幾種方式將查詢更改爲使用索引。

如果EVENT_DATE只包含日期元素使用

where event_date = date '2016-04-08' 

如果EVENT_DATE包含時間元素使用

where event_date >= date '2016-04-08' 
and event_date < date '2016-04-09' 

注意,在一個特殊的方式甲骨文存儲日期值。它們不存儲任何特定的蒙版。格式化只是一個顯示的事情。所以我們需要做的是以有意義的格式傳遞目標日期。