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.