Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Corona Datenbank mit Auswertung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL Corona Datenbank mit Auswertung

    Hallo Allerseits,

    ich bin neu hier und hoffe gleich auf eure Hilfe.

    Für unser Fitness-Studio müssen wir nun in der Coronazeit eine Anwesenheitsliste führen.
    Die Mitgliedsnummern sind als Barcode auf den Nutzerausweisen hinterlegt.
    Wenn jemand trainieren kommt, soll er seinen Ausweis an einem Terminal scannen. Beim gehen das gleiche.
    Man sieht auch die noch freien Plätze – es dürfen nur 30 gleichzeitig im Studio trainieren.
    Diese Daten werden in eine MySQL-Tabelle eingetragen.
    Ganz einfach: Benutzernummer (char), kommen (time), gehen (time), Datum (date)

    Alle Nutzer mit Zeiten anzeigen ist easy, automatisches Löschen habe ich auch hinbekommen:
    DELETE FROM corona WHERE Datum < CURRENT_DATE - INTERVAL '28' DAY

    So, jetzt will mein Chef aber auch eine Auswertung. Welche Sportler waren zur gleichen Zeit anwesend, hätten sich also anstecken können. Wie mache ich das?
    Es sind ja unterschiedliche Varianten möglich. Am gleichen Tag z.B.:

    SportlerA kommen: 10:30 gehen: 13:30
    SportlerB kommen: 11:00 gehen: 13:00
    SportlerC kommen: 12:30 gehen: 15:00
    SportlerD kommen: 14:30 gehen: 17:00

    Bei A B C haben sich die Trainingszeiten überschnitten und ebenso: C D
    Wenn C jetzt krank gewesen ist und man nach C sucht sollen A B D angezeigt werden.
    Wenn man nach B sucht, nur: A C

    Könnt ihr mir helfen, vielen Dank im voraus!

    Olit

  • #2
    mal mit PostgreSQL und Timerange-Datentypen:

    Code:
    test=*# select * from corona ;
     wer |                    von_bis                    
    -----+-----------------------------------------------
     a   | ["2020-05-28 10:30:00","2020-05-28 13:30:00")
     b   | ["2020-05-28 11:00:00","2020-05-28 13:00:00")
     c   | ["2020-05-28 12:30:00","2020-05-28 15:00:00")
     d   | ["2020-05-28 14:30:00","2020-05-28 17:00:00")
    (4 rows)
    
    test=*# with zusammen as (select c1.wer wer1, c1.von_bis vb1, c2.wer wer2, c2.von_bis vb2 from corona c1 cross join corona c2 where c1.wer != c2.wer and c1.wer < c2.wer and c1.von_bis && c2.von_bis ) select * from zusammen where (wer1='c' or wer2='c');
     wer1 |                      vb1                      | wer2 |                      vb2                      
    ------+-----------------------------------------------+------+-----------------------------------------------
     a    | ["2020-05-28 10:30:00","2020-05-28 13:30:00") | c    | ["2020-05-28 12:30:00","2020-05-28 15:00:00")
     b    | ["2020-05-28 11:00:00","2020-05-28 13:00:00") | c    | ["2020-05-28 12:30:00","2020-05-28 15:00:00")
     c    | ["2020-05-28 12:30:00","2020-05-28 15:00:00") | d    | ["2020-05-28 14:30:00","2020-05-28 17:00:00")
    (3 rows)

    Abfrage für Person 'c'.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Ich haette `kommen` und `gehen` als DATETIME gespeichert... das macht das Rechnen wesentlich einfacher.

      Kommentar


      • #4
        Danke für die schnellen Reaktionen.
        Cross Join muss ich mir ansehen.
        Gut, DATETIME geht auch, dann braucht man das Datum nicht extra. Wie sieht es im anderen Format aus?

        Kommentar


        • #5
          Wie sieht was in welchem Format aus?

          Kommentar


          • #6
            Du schreibst:

            >Ich haette `kommen` und `gehen` als DATETIME gespeichert... das macht das Rechnen wesentlich einfacher.

            also nicht im Format/Typ date und time sondern als DATETIME, weil man damit besser rechnen kann. Wie kann man mein Problem mit dem DATETIME lösen?
            Wenn die Tabelle, so aussieht:
            Benutzernummer (char), kommen (datetime), gehen (datetime)

            Kommentar


            • #7
              Wie findet man zeitliche Überlappungen in MySQL:
              Code:
              SELECT r.start, r.end FROM range r WHERE [start] < r.end AND [end] > r.start
              wobei hier [start] und [end] die Timestamps für das Suchintervall sind, in deinem Fall also die Anwesenheitszeiten der betroffenen Person (=> JOIN).

              Kommentar


              • #8
                remark:
                Die zeitlichen Überlappung sind nicht zwingend aussage fähig, da wohl das Fenster auch durch desinfektion/benutzte geräte etc limitiert wird.

                Für unser Fitness-Studio müssen wir nun in der Coronazeit eine Anwesenheitsliste führen.
                Es bleibt in meinen Augen auch hier die Frage, was man muss (gesetztlich) oder was man implementiert um den Nutzern der Anlangen den grösstmöglichen "Schutz" zu bieten.

                Kommentar

                Lädt...
                X