MySQL Tarihe Göre Kayıt Adetleri

Merhabalar. Kullanılan bir sistemde raporlara 2 adet yeni sayfa eklenmesi istendi. Bunlardan biri günlük olarak kayıt edilen mesaj adeti, diğeri ise istenilen tarihteki saatlik kayıt edilen mesaj adetinin gösterimi. PHP ile yapılacak ama önce SQL sorgusunu yazacaz ki gösterelim. Bu adet verileri herhangi bir yere yazılmadığından ana tablodan sql sorgusu ile çekmeliyiz. İlerde sizlere de gerekebilir diyerek SQL kodlarını paylaşayım.

Veritabanımız: MySQL 5.X
Tablomuz: ChatMaster
Tarih Sütunu: start_date
Kötü Durum: start_date sütunundaki veriler tarih saat şeklinde (Yani; 2018-09-01 12:34:56 gibi)

Önce 1 Eylül 2018 sonrası oluşan kayıtları gün bazlı çekeceğiz. Bu günlük adet verisini verecek.

SELECT DATE(start_date) TARIH, COUNT(*) ADET FROM ChatMaster 
WHERE start_date>='2018-09-01 00:00:00' GROUP BY DATE(start_date)

Peki burdaki sorgu nedir? Bana tarih bazlı veri gerektiğinden SELECT içerisinde DATE(start_date) diyerek start_date sütunundaki verilerden sadece tarih kısmıyla ilgilendiğimi söyledim ve TARIH ismine atadım ( İsterseniz siz araya *as* yazabilirsiniz.). Daha sonra saymak için COUNT kullandım. Burdaki şartım 1 Eylül 2018 00:00:00 ve sonraki kayıtlarla işlem yapmak gerektiğinden WHERE ile bu şartı sağladım. GROUP BY ile de gruplandırma yaptım ki hepsini sayıp ilk tarihin içine toplamını yazmasın. Sonuç;

TARIH ADET
2018-09-01 201
2018-09-02 127
2018-09-03 571
2018-09-04 423
2018-09-05 454
2018-09-06 370
2018-09-07 349
2018-09-08 190
2018-09-09 162
2018-09-10 537
2018-09-11 476
2018-09-12 79

Peki GROUP BY kullanmasaydım sonuç ne olurdu? Aşağıdaki gibi olacaktı.

TARIH ADET
2018-09-01 3939

Buraya kadar herşey tamam. Peki saat bazlı bir önceki günün verisini nasıl alacaz? Önceki sorguyu zaten biliyoruz. Bu sorguyu saat bazlı hale getirelim. DATE gördüğümüz her yere HOUR yazmamız yeterli olacaktır.

SELECT HOUR(start_date) SAAT, COUNT(*) ADET FROM ChatMaster
WHERE start_date>='2018-09-11 00:00:00' and start_date<='2018-09-11 23:59:59' 
GROUP BY HOUR(start_date)
SAAT ADET
0 5
1 9
2 7
3 3
4 1
5 2
6 1
7 5
8 7
9 25
10 23
11 51
12 31
13 45
14 56
15 32
16 51
17 31
18 14
19 19
20 16
21 21
22 5
23 16

Tablo acayip gözüktü. Tabii gözüme hoş gelmedi. Önce kendin beğeneceksin 🙂 Hadi gelin CONCAT ile güzelleştirelim.

SELECT CONCAT( HOUR(start_date), ':00 - ', CONCAT( HOUR(start_date), ':59' ) ) SAAT, 
COUNT(*) ADET FROM ChatMaster
WHERE start_date>='2018-09-11 00:00:00' and start_date<='2018-09-11 23:59:59' 
GROUP BY HOUR(start_date)

Sonuca bakın ne güzel oldu?

SAAT ADET
0:00 – 0:59 5
1:00 – 1:59 9
2:00 – 2:59 7
3:00 – 3:59 3
4:00 – 4:59 1
5:00 – 5:59 2
6:00 – 6:59 1
7:00 – 7:59 5
8:00 – 8:59 7
9:00 – 9:59 25
10:00 – 10:59 23
11:00 – 11:59 51
12:00 – 12:59 31
13:00 – 13:59 45
14:00 – 14:59 56
15:00 – 15:59 32
16:00 – 16:59 51
17:00 – 17:59 31
18:00 – 18:59 14
19:00 – 19:59 19
20:00 – 20:59 16
21:00 – 21:59 21
22:00 – 22:59 5
23:00 – 23:59 16

Gerisi zaten basit. Bu SQL sorgusunu al, PHP kodunun içinde kullan.

Hoşçakalın.