Datum nach Wochentag und Stunde aufteilen.

  • Guten Morgen,


    ich bräuchte hier mal paar Denkanstöße.


    Folgendes habe ich vor.

    Wie bereits in einem anderen Post gefragt, würde ich gerne eine Heatmap Chart für online Zeiten erstellen. Die Heatmap habe ich bereits und funktioniert grundsätzlich.


    Ich versuche nun eine effiziente Strategie zu entwickeln, wie ich die Daten entsprechend aufbereite und in die Map eingebe.

    Ziel ist es, die Daten aufgeschlüsselt nach halber Stunde pro Wochentag, anzuzeigen.

    Montag:

    00:00 – 00:30 123

    00:30 – 01:00 567

    01:00 – 01:30 234

    Usw.

    Hier habe ich mir aber überlegt, nicht die absoluten Zahlen auszugeben, sondern die relativen Zahlen in Prozent.

    Datenselektion und Wochentag Ermittlung ist alles soweit kein Problem


    Daten liegen als DATETIME in einer SQL Datenbank (2020-07-15 07:28:00).

    Was mir ein bisschen Kopfzerbrechen bereitet, wie kann ich sinnvoll die DATETIME in 30 Minuten Intervalle zerlegen und dann entsprechend pro Wochentag prüfen.

    Hat jemand eine gute Idee, ich denk schon wieder zu kompliziert.


    Danke sehr

  • Kann nicht genau folgen.

    Zitat

    00:00 – 00:30 123

    Soll das angeben, wie viele User zu der Zeit angemeldet waren?

    Also 123 User in der halben Stunde?

    ---

    Du kannst GROUP BY nutzen. Zwar nicht mit halben Stunden (evtl mit nem "Trick"),

    aber ganz einfach über das Format:

    SQL
    1. GROUP BY DATE_FORMAT(`created_at`, '%Y-%m-%d %H')


    Example:

    SQL
    1. -- SET @date_format := '%Y-%m-%d'; -- Get grouped counts by hour.
    2. SET @date_format := '%Y-%m-%d %H'; -- Get grouped counts by hour.
    3. -- SET @date_format := '%Y-%m-%d %H:%i'; -- Get grouped counts by min.
    4. SELECT
    5. -- select the datetime by format
    6. DATE_FORMAT(`created_at`, @date_format) AS `created_at`,
    7. -- count the amount for that formatted datetime group
    8. COUNT(`user_id`) AS `count`
    9. FROM `user_login_log`
    10. GROUP BY DATE_FORMAT(`created_at`, @date_format);


    Test: http://sqlfiddle.com/#!9/aac84a/4

  • Danke für deine Antwort.

    Ich habe etwas rumprobiert und eine Lösung gefunden, die ich euch nicht vorenthalten will. Scheint mir genau das wiederzuegeben, was ich wollte.

    Das kann ich wiederum in meine HEadmap Chart einfügen. Das probiere ich aber dann heute Abend.

    SQL
    1. SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(zeitpunkt)/(1800))*1800) AS timekey, count(name)
    2. FROM test
    3. GROUP BY timekey
    4. order by timekey;


    http://sqlfiddle.com/#!9/7e56fa/1