Pit: mysql: Daten Tageweise augeben

Hallo,

ist es möglich, sich die Daten einer Tabelle mit Start- und End-Spalte tageweise ausgeben zu lassen?

Bsp: Start: 2017-11-16 11:05:00
       End: 2017-11-18 00:00:00

Ausgabe: 2017-11-16 11:05:00, Daten…
         2017-11-17 11:05:00, Daten…
         2017-11-18 11:05:00, Daten…

Frage 2: Ist es alternativ (falls obiges nicht geht) möglich, von einem Startdatum ausgehend bis zu einem Enddatum neue Einträge vorzunehmen? (über php müßte das doch eigentlich über $dayAdd itterierend mit date('d', strtotime('+'.$dayAdd.' day', $startTime)).".".$my_monat.".".$my_jahr.") gehen, oder?

Pit

  1. Tach!

    ist es möglich, sich die Daten einer Tabelle mit Start- und End-Spalte tageweise ausgeben zu lassen?

    Ja, wenn du dir eine Stored Procedure erstellst, in der du ein Programm stehen hast, das für diese nicht vorhandenen Datensätze Einträge in der Ergebnismenge erzeugt. Mit anderen Worten: Was du da hast ist ein Spezialfall, für den keine Funktion vorgesehen ist. Du kannst abfragen, was in den Tabellen enthalten ist, aber nicht mit einem mehr oder weniger komplexen SELECT-Statement nicht vorhandene Daten in die Ergebnismenge bringen.

    Es gibt einige unschöne Lösungen für solcherart Intervalle, aber die arbeiten dann mit einer Hilfstabelle, in der fortlaufend Zahlen von 1 bis X stehen, gegen die dann gejoint werden kann, mit WHERE-Klausel von Nummer des Start-Tages bis Nummer des End-Tages.

    Frage 2: Ist es alternativ (falls obiges nicht geht) möglich, von einem Startdatum ausgehend bis zu einem Enddatum neue Einträge vorzunehmen? (über php müßte das doch eigentlich über $dayAdd itterierend mit date('d', strtotime('+'.$dayAdd.' day', $startTime)).".".$my_monat.".".$my_jahr.") gehen, oder?

    Programmatisch mit Schleife in einer Stored Procedure geht das auch innerhalb der Datenbank. Vermutlich ist es für dich einfacher, eine Schleife mit INSERT-Statements (oder etwas ähnliches) in PHP zu erstellen.

    dedlfix.

    1. Hi dedlfix,

      dank Dir für die Hilfe.

      Es gibt einige unschöne Lösungen für solcherart Intervalle, aber die arbeiten dann mit einer Hilfstabelle, in der fortlaufend Zahlen von 1 bis X stehen, gegen die dann gejoint werden kann, mit WHERE-Klausel von Nummer des Start-Tages bis Nummer des End-Tages.

      Ja, diese Lösungen kenne ich. Aber die Hilfstabellen müssen dann auch dynamisch erzeugt werden, damit sie immer funktionieren.

      Programmatisch mit Schleife in einer Stored Procedure geht das auch innerhalb der Datenbank. Vermutlich ist es für dich einfacher, eine Schleife mit INSERT-Statements (oder etwas ähnliches) in PHP zu erstellen.

      Da hst Du völlig recht. Wobei, da ist mir auch etwas aufgefallen, was ich mir grad nicht erklären kann?

      Pit

      1. Tach!

        Aber die Hilfstabellen müssen dann auch dynamisch erzeugt werden, damit sie immer funktionieren.

        Es reicht, eine Tabelle einmalig zu erzeugen, fortlaufend von 1 bis zu einem ausreichend hohem Wert. Für Tage eines Monats wäre das 31, für Tage eines Jahres dann 366.

        Das Intervall, was du letzlich in deiner Aufgabenstellung brauchst, kannst du mittels in der WHERE-Klausel mittels BETWEEN abfragen.

        Bedenke bei Datenbanken, dass sie mengenorient arbeiten. Man kann aus den vorhandenen Daten die komplette Menge oder eine Teilmenge abfragen, um daraus die Ergebnismenge zu generieren. Diese Ergebnismenge kann man wiederum als Subselect einsetzen (z.B. WHERE feld IN (Teilmenge einer anderen Menge)) oder als zu joinende Menge (FROM tabelle JOIN (Teilmenge einer anderen Menge) ON ...). Du brauchst also nicht jedes Mal eine neue Menge, sondern kannst eine Teilmenge on-the-fly erzeugen.

        dedlfix.

  2. Hallo Pit,

    deine Frage klingt nach einem A-B Problem. Problem B diskutieren wir hier. Aber wie lautet Problem A? Sprich: Was willst Du eigentlich tun? Sinn der Frage: Kann man Problem A lösen, ohne Problem B zu bekommen?

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Pit,

      deine Frage klingt nach einem A-B Problem. Problem B diskutieren wir hier. Aber wie lautet Problem A? Sprich: Was willst Du eigentlich tun? Sinn der Frage: Kann man Problem A lösen, ohne Problem B zu bekommen?

      Hi Rolf,

      ok, worum gehts?

      Wenn ein User einen Termin vom 10.10.2017 bis zum 15.10.2017 hat, trage ich in der Termintabelle den Termin ein und in der Teilnehmertabelle den Teilnehmer und die TerminID.

      Meine ursprpngliche Idee, wenn der User den 13.10.2017 löschen will (also nicht die Serie, sondern den Einzeltermin aus der Serie) war, dass ich je Termin mehrere Teilnehmerzeiträume eintrage. Das stößt aber an seine Grenzen, wenn der User einen Einzeltermin innerhalb einer Serie variieren will. Dann mu´ß ich dennoch an die termintabelle ran. Also dachte ich mir, dass ich strikt trenne zwischen Serientermin und einzeltermin. Und wenn ein user aus einer Serie einen Einzeltermin löschen oder variieren möchte, trenne ich die Serie in tageweise Einzeltermine, sowohl in der Termintabelle als auch in der Teilnehmertabelle. Somit speichere ich Serientermine normalisiert und Einzeltermine (also auch Serien, die in Einzeltermine gesplittet sind) mehr oder weniger redundant.

      Das war also mien Problem A, das Ursprungsproblem.

      Pit