2011-02-01 13 views
7

timestamp olan updatetime adlı bir sütun var. Örneğin, ortalama bir ortalama değer şu olabilir: 2011-02-01 09:00:51. Tarihe bakılmaksızın günün belirli bir saatinde tüm sonuçları arayabilmek ve geri dönmek istiyorum.mysql - arama saat damgası günün saatine göre

2011-02-01 09:00:51 
2011-01-31 09:20:51 
2011-01-11 09:55:44 
etc.... 

SELECT * FROM table WHERE updatetime ......

Düşünceler: Örneğin

Ben dönecekti değerler BETWEEN 09:00:00 AND 09:59:99 için sütun arama olur? HOUR() ile

cevap

14

Sen HOUR() işlevini kullanabilirsiniz: - işlevleri değiştirilebilir kesici değildir, bu nedenle olacak

SELECT * FROM 'table' WHERE HOUR(`updatetime`) = 9 

Alas, bu sorgunun performansını en kısa sürede birkaç bin satır üzerinde giderken, korkunç olacak Bu sorgu her çalıştığında tam bir tablo taraması.

Benzer bir durumda neler yaptık: updatetime_hour numaralı başka bir sütunu oluşturduk, dizine ekledik ve eklemeye ekledik (ve güncellemede güncellendi); daha sonra sorgu hızlı olur:

SELECT * FROM 'table' WHERE `updatetime_hour` = 9 

Evet, veri denormalized gelmiş ve biraz daha temizlik, ama daha hızlı bir çözüm henüz görmedik. (Biz kabul edilir ve ölçülen ekleme ve güncelleştirme updatetime den updatetime_hour doldurmak için tetikler, ancak performans için karşı karar; onlar sizin için yararlı olacağını görmek.)

+0

İyi noktası çalıştı budur performansından bahset. Endeksli bir saat dilimini yeterince kolay eklemek için uygulayabilirim, ancak önceki 60k satırlarıma ve UPDATE üzerinden 'updatetime_hour' sütun verileriyle nasıl geçeceğime dair herhangi bir fikrim var mı? – themerlinproject

+1

@ user410341: Yoğun olmayan saatlerde ve çok dikkatli bir şekilde;) 'UPSTATE yourtable SET updatetime_hour = HOUR (updatetime);' <- bu bir süre alacaktır – Piskvor

+0

Teşekkürler, sadece yeni bir soru olarak gönderdim: http: // stackoverflow.com/questions/4866056/mysql-create-indexed-hour-column-from-existing-timestamp – themerlinproject

1

Dene: Bu 09:00:00 ve 09:59:59 arasındaki tüm satırları döndürür

SELECT * FROM table WHERE HOUR(updatetime) = 9; 

.

HOUR() yalnızca tarihin saat bölümünü döndürür.

1
SELECT * FROM table WHERE hour('updatetime') = 9; 

9 am dönecekti ..

0

olasılığı: SELECT * FROM 'table' WHERE HOUR(updatetime)='09';

0

Bu cevaplar çalışmaz, bu benim sadece

SELECT hour(FROM_UNIXTIME(`updatetime`)) AS date_formatted FROM `table` where hour(FROM_UNIXTIME(`updatetime`))='9' 
İlgili konular