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

Belirli bir tarih biçimini kullanarak tarihi karşılaştırmak istiyorum ancak bu sorguyu çalıştırdığımda çok zaman alıyor. Aynı sonucu minimum süre ile alabileceğim bir yol var mı?to_date/to_char işlevini kullanmadan oracle sql'de tarihi nasıl karşılaştırabilirim?

+2

Neden "event_date" üzerinde bir "to_char" yapıyorsunuz, tahmin ediyorum ki dizede "to_date" yapmak yerine bir "date" var mı? 'Event_date' zaman bileşenini gece yarısına ayarlanmaya zorlamaya mı çalışıyorsunuz? Hangi endeksler mevcut? 'Event_date' endeksli mi? Tabloda hangi indeksler tanımlanmış? –

+0

Sanırım bütün gün istiyorsun. Aşağıdakileri deneyin: ' olayından olayını seçin; burada eventName = 'ARTICLE' ve event_date to_date ('08 -04-2016 ',' dd-mm-yyyy ') ve to_date ('09 -04- 2016' , 'gg-aa-yyyy') ' – dcieslak

+0

endeksler dahil tablo yapıları (gönderilmesi için lütfen) ve sorgunuzun planını açıklamak – Aleksej

cevap

1

EVENT_DATE tarihinde bir dizininiz var mı? Eğer yapmıyorsanız, tam bir tablo taraması var ve bu, bir dizin oluşturmadan aldığı kadar hızlı.

Dizininiz varsa, sorgunuz bunu kullanmaz, çünkü to_char() bunu devre dışı bırakır. Tablonuzun yeterince farklı tarihleri ​​olduğunu ve bir endeks kullanmaya değer hale getirmek için yeterince toplandıklarını varsayalım. Bir indeksi birkaç yolla kullanmak için sorguyu değiştirebilirsiniz.

EVENT_DATE EVENT_DATE bir zaman elemanı bu

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

Not kullanmak içeriyorsa sadece tarih elemanı bu

where event_date = date '2016-04-08' 

kullanmak içeriyorsa o özel bir şekilde Oracle depolar TARİH değerleri. Herhangi bir maske ile saklanmazlar. Biçimlendirme sadece bir görüntüdür. Yani tek yapmamız gereken hedef tarihi anlamlı bir biçimde geçmektir.

İlgili konular