Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem mit Datumsvergleich

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Problem mit Datumsvergleich

    Hallo,

    ich habe ein Problem mit Datumsvergleichen, bekomme es einfach nicht hin, weshalb ich um eure Hilfe bitte.
    Ich habe folgende 2 Tabellen in einer MySQL-Datenbank (personen, altersklassen).

    personen (enthält alle notwendigen Daten der Spieler, u.a. das Geburtsdatum):
    id (int)
    vorname (varchar)
    nachname (varchar)
    geburtstag (date)

    altersklassen (hierin werden die Altersklassen entsprechend mit einem Start- und Enddatum fest definiert):
    id (int)
    altersklasse (varchar)
    start_date (date)
    end_date (date)

    Folgendes möchte ich nun in die Praxis umsetzen. Entsprechend dem Geburtsdatum eines Spielers aus der Tabelle personen soll mit einer Datenbank-Abfrage die zugehörige Altersklasse aus der Tabelle altersklassen ausgegeben werden.

    Beispiel:
    vorname: Max
    nachname: Meier
    geburtstag: 1989-01-04

    In der Tabelle altersklassen soll nun geprüft werden, welcher Altersklasse der Spieler aufgrund seines Geburtsdatums zugehörig ist.
    Im genannten Beispiel wäre dies "Senioren", da das Geburtsdatum innerhalb von start_date und end_date der Senioren liegt:
    start_date: 1995-12-31
    end_date: 1960-12-31
    altersklasse: Senioren

    Es geht um die DB-Abfrage, die bei mir kein entsprechendes Ergebnis liefert. Das Geburtsdatum des Spielers ist in der Variable $datensatz[geburtstag] gespeichert. Folgendermaßen sieht die Abfrage derzeit bei mir aus:

    Code:
    $abfrage = mysql_query("SELECT * FROM altersklassen WHERE '$datensatz[geburtstag]' between start_date and end_date");
    $ergebnis = mysql_fetch_assoc($abfrage);
    echo "Altersklasse: $ergebnis[altersklasse]";
    Nach "Altersklasse:" steht nix. Kann mir jemand helfen und sagen, woran das liegt?
    Vorher habe ich mich natürlich mit der Datenbank verbunden, andere Abfragen funktionieren.
    Vielen Dank schon einmal im Voraus, ich freue mich auf eure Antworten und Hilfen.

  • #2
    Code:
    SELECT * FROM altersklassen WHERE '$datensatz[geburtstag]' between start_date and end_date");
    Greif doch statt '$datensatz[geburtstag]' direkt auf personen.geburtstag zu?! Hier brauchst du doch PHP gar nicht.

    Anmerkungen:

    Im genannten Beispiel wäre dies "Senioren", da das Geburtsdatum innerhalb von start_date und end_date der Senioren liegt:
    start_date: 1995-12-31
    end_date: 1960-12-31
    - Ab Geb. 1995 ist man schon ein Senior ?
    - Ich würde das EndDatum "offen" lassen (bzw. weiter in die Vergangenheit schieben), bzw. bedenke falls jemand vor 1960 geboren ist dann fällt der dir überall raus.
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Zitat von hausl Beitrag anzeigen
      Anmerkungen:

      - Ab Geb. 1995 ist man schon ein Senior ?
      - Ich würde das EndDatum "offen" lassen (bzw. weiter in die Vergangenheit schieben), bzw. bedenke falls jemand vor 1960 geboren ist dann fällt der dir überall raus.
      Von der Altersklasseneinteilung des DFB ausgehend:
      - Ja, alle 1995 geborenen Spieler sind in der Saison 2014/15 als Senioren einzustufen.
      - Wer sagt, dass es nicht noch eine Altersklasse über den Senioren gibt? Altherren-Mannschaften gibt es zu Genüge.

      Kommentar


      • #4
        Zitat von christiancg80 Beitrag anzeigen

        altersklassen (hierin werden die Altersklassen entsprechend mit einem Start- und Enddatum fest definiert):
        id (int)
        altersklasse (varchar)
        start_date (date)
        end_date (date)
        Hier gehört ein Alter von bis (in Jahren) rein und kein Datum. Oder möchtest du diese Tabelle jedes Jahr neu erstellen?

        Kommentar


        • #5
          Zitat von jspit Beitrag anzeigen
          Hier gehört ein Alter von bis (in Jahren) rein und kein Datum. Oder möchtest du diese Tabelle jedes Jahr neu erstellen?
          Wieder die Annahme, dass wir es mit gängigen Altersklasseneinteilungen (wie z.B. die des DFB) zu tun haben, die für gewöhnlich für jede Spielzeit definierte Stichtage haben:
          Nein, denn zwei gleichaltrige (in Jahren) Spieler sind nicht zwangsläufig in derselben Altersklasse (Spieler 1 geboren 31.12.1995, Spieler 2 geboren 1.1.1996: S1 -> Senior, S2 -> U19) und innerhalb einer Spielzeit sollte es zu keinem Wechsel einer Altersklasse kommen.

          Kommentar


          • #6
            Ja, wenn eifrige Funktionäre für jede Saison neue Altersklassen mit Stichtagen festlegen,
            dann ist so wie es christiancg80 macht ok.

            Kommentar


            • #7
              Zuerst einmal vielen Dank für die schnellen und vielen Rückmeldungen !!!

              Ich gebe hiermit auf alle bisherigen Antworten ein Feedback:

              @ hausl: Du hast natürlich recht, kann auch direkt (ohne PHP) auf das Geburtsdatum zugreifen, indem ich in der Abfrage personen.geburtstag verwende - hab ich entsprechend geändert.

              Ja, ab Baujahr 1995 ist man in der aktuellen Saison 2014/2015 ein Senior, was im Fussball bedeutet, dass man im Männerbereich spielt. So, wie es Der Hans korrekt geschrieben hat

              Bezgl. dem Enddatum - in dem Fall ist relevant, dass man ab dem Geburtsdatum 01.01.1995 und älter als Senioren-Spieler gilt. D.h. auch jemand, der 1945 geboren ist, und noch in der Tabelle steht, ist entsprechend als Senior gekennzeichnet.

              @ Der Hans:
              Genau richtig, es handelt sich hierbei um die Altersklasseneinteilung des DFB, der Stichtag ändert sich dementsprechend nach jeder Saison. Diese Stichtage werden von mir dann nach Saisonende entsprechend in der Tabelle altersklassen angepasst.

              Eine Altersklasse über den Senioren (sprich Altherren) kann ich bei Bedarf immer noch einfügen, ist bei uns in der Region aber aktuell nicht relevant.

              @ jspit:
              Ich kann die Zuordnung nicht über das Alter machen, da sich die Stichtage ändern. Demzufolge passe ich die Tabelle altersklassen vor jeder Saison, wie oben schon geschrieben, entsprechend an.
              Der Hans hat das in seiner zweiten Antwort genau richtig beschrieben (zwei gleichaltrige Spieler müssen nicht zwangsläufig in der gleichen Altersklasse spielen; es kommt immer auf den Stichtag drauf an). Zu einem Wechsel der Altersklasse kommt es niemals innerhalb einer Saison, sondern immer nur nach einer abgelaufenen Saison.


              Das Problem ist hiermit gelöst, die Zuordnung funktioniert jetzt einwandfrei. VIELEN DANK AN ALLE !!!!

              Kommentar


              • #8
                Zitat von christiancg80 Beitrag anzeigen
                start_date: 1995-12-31
                end_date: 1960-12-31
                altersklasse: Senioren
                Wenn du dies so drin hast muss das resultat leer bleiben.

                Kommentar


                • #9
                  nimm dir zuerstmal phpmyadmin vor und hau die Abfrage dort rein - wenn du es schaffst dort das gewünschte Ergebnis zu bekommen, kannst du dich darum kümmern, es in PHP abzufragen und auszugeben ....

                  mE hast du in deinem Script viel unsauberen Code drin .. assoziative Arrays verwenden Strings als Key - der gehört auch in Quotes... - inline Strings.... usw

                  lass dir auch die Abfrage (also den String) vorher mal ausgeben, ob die überhaupt richtig zusammengebaut wurde
                  "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

                  Kommentar


                  • #10
                    Die Stichtage für die Altersklassen sind doch im sportlichen Bereich immer der Jahreswechsel (ist zumindest beim DHB so, ich denke der DFB wird das nicht anders machen).
                    D.H. du musst die Altersklassen nicht jährlich personell ändern, du kannst einfach einen Basiswert definieren. Im Bezugsjahr 2015 gilt X = 0 (start_date: 1995-12-31). Dann nimmst du das aktuell laufende Jahr und ermittelst die Differenz zu 2015 in 2016 wäre das also x=1 (1 Jahr Differenz).
                    Für deine Prüfung der Altersklasse nimmst du dann immer den Basiswert aus der Datenbank und erhöhst die Jahresangabe um X.
                    Für 2016 wäre es dann automatisch (start_date: (1995+1)-12-31)

                    Kommentar


                    • #11
                      Ganz so einfach ist es nicht. Du musst schon die aktuelle Saison mit Start und Ende berücksichtigen. Wenn dies auch jedes Jahr neu festgelegt wird, bringt das dynamische Berechnen der Altersklassen nicht viel.

                      Kommentar


                      • #12
                        Also muss man sich noch von der offiziellen Seite das Saisonende holen und eine Fallentscheidung für die jeweilige "Jahreshälfte" einbauen.

                        Oder den "Wechsel" in die Spielfreie Zeit (ende Juli?) legen.

                        Alternativ X Fest in die DB schreiben, dann müsste man wenigstens nur noch diesen einen Wert nach Saisonende Anpassen.

                        Kommentar


                        • #13
                          @jspit:

                          Wenn du dies so drin hast muss das resultat leer bleiben.
                          Richtig, ich hatte das Anfangs- und Enddatum vertauscht. Hab es geändert, und schon passt es.

                          @TessaKavanagh:
                          Die Stichtage für die Altersklassen sind doch im sportlichen Bereich immer der Jahreswechsel (ist zumindest beim DHB so, ich denke der DFB wird das nicht anders machen).
                          D.H. du musst die Altersklassen nicht jährlich personell ändern, du kannst einfach einen Basiswert definieren. Im Bezugsjahr 2015 gilt X = 0 (start_date: 1995-12-31). Dann nimmst du das aktuell laufende Jahr und ermittelst die Differenz zu 2015 in 2016 wäre das also x=1 (1 Jahr Differenz).
                          Für deine Prüfung der Altersklasse nimmst du dann immer den Basiswert aus der Datenbank und erhöhst die Jahresangabe um X.
                          Für 2016 wäre es dann automatisch (start_date: (1995+1)-12-31)
                          Ich geb dir recht, die Stichtage sind im Normalfall immer der Jahreswechsel. Allerdings war es mal nicht so, da war der Stichtag zb. der 01.07. Und um genau dem vorzubeugen, gehe ich lieber auf Nummer sicher und ändere die Stichtage für jede Altersklasse nach Saisonabschluss ein mal... dauert 1min

                          @eagle275:
                          Danke für den Hinweis. Ich hab noch nicht so viele Erfahrungen im Programmieren mit PHP, weshalb ich für jeden solcher Hinweise (wie zb. mit den Quotes) und Tipps dankbar bin.

                          Kommentar


                          • #14
                            Zitat von jspit Beitrag anzeigen
                            Ganz so einfach ist es nicht. Du musst schon die aktuelle Saison mit Start und Ende berücksichtigen. Wenn dies auch jedes Jahr neu festgelegt wird, bringt das dynamische Berechnen der Altersklassen nicht viel.
                            Hallo jspit, beziehst du deine Nachricht auf meine Antwort? Weiss nicht genau, was du damit meinst... kannst du mir kurz auf die Sprünge helfen?

                            Kommentar


                            • #15
                              Nein, die Bemerkung #11 bezieht sich auf #10 von TessaKavanagh unmittelbar davor.

                              Kommentar

                              Lädt...
                              X