Polar: MySQL Select mit Datumsbedingung

Hallo,

ich bin gerade dabei ein kleines Redaktionssystem zu schreiben, daß auch die Option "Start- und Killdate" kennt - also z.B. wird eine News heute schon angelegt, erscheint aber erst übermorgen und läuft bis zum Datum x.

$sql = "SELECT * FROM ".$subbase." WHERE publish='1' AND (datum BETWEEN $redstart AND NOW()) AND (kill >= NOW()) ORDER BY datum DESC";

Die erste Bedingung (datum BETWEEN $redstart AND NOW()) funktioniert einwandfrei, die zweite, daß sog. "Kill-Date" funzt nicht. Ich bin mir nicht sicher, wie ich den Vergleichsoperator schreiben muß. Denke mal, ">" ist falsch. "kill" und "datum" sind beides DATETIME Felder.

Im Prinzip fehlt mir also nur der Vergleich, ab wann die News nicht mehr erscheinen darf.

Hat jemand eine Idee, wie ich (kill >= NOW()) richtig schreibe?

Danke
Gruss Polar

  1. Mit $kill auf alle Fälle!

    1. Mit $kill auf alle Fälle!

      so. ich habe es jetzt in KILLDATE umbenannt und die SELECT Bedingung etwas verändert (und das $redstart rausgenommen, weil es eigentlich überflüssig war).

      Die SELECT Anweisung sieht jetzt so aus:
      $sql = "SELECT * FROM ".$subbase." WHERE publish='1' AND ((NOW() >= datum) AND (NOW()<killdate)) ORDER BY datum DESC";

      -> funktioniert tadellos!!! :-)

      Ich möchte noch eine Funktion implementieren, die ich mal für mich "sticky" genannt habe. Die soll dafür sorgen, daß eine xbeliebige, aktuelle News IMMER ZUERST zu sehen ist, solange ein Feld "sticky" im Datensatz =1 ist. Das könnte ich für besonders wichtige Statements verwenden.

      Ich habe jetzt versucht, in die Testdaten einen Eintrag als "sticky=1" zu markieren (in der DB), aber bis jetzt wird es ignoriert. Passt das überhaupt in meine SELECT Anweisung noch rein?

      Ich möchte ja, daß die anderen News genauso selected werden wie in der SELECT Anweisung (oben).

      Bringt mir da ein "GROUP BY datum,sticky" etwas? Funktioniert hat es jedenfalls nicht. Ich möchte erreichen, daß alles so sortiert wird, wie oben in der SELECT Anweisung, falls dabei eine News im Feld "sticky" eine 1 stehen hat, diese allerdings mit der allerhöchsten Prio zuerst einsortiert wird. Mir ist selbstverständlich klar, daß ich nur eine (aktuelle) mit dem "sticky" haben sollte.

      Ist das in einer knappen Anweisung realisierbar? bzw. bekomme ich das noch in meinem SELECT unter?

      Danke
      schönen Gruss

      1. Hello,

        $sql = "SELECT * FROM $subbase ".
               "WHERE publish='1' AND (((NOW() >= datum) AND (NOW()<killdate)) ".
                                      " OR (sticky = 1)) ".
               " ORDER BY sticky desc, datum DESC";

        Das Sortieren über eine "boolesche" Spalte ist zwar nicht so glücklich (das kostet leider Kraft), aber anders wird es mit einem Statement nicht gehen.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo,

          das sah zwar alles auf den ersten Blick ganz gut aus und hat auch funktioniert, aber jetzt habe ich dadurch ein neues Problem:

          Nehmen wir mal an, es gäbe gar keine tagesaktuellen News. Dann werden gar keine Records zurückgegeben, sprich der alte Newsbestand wird gar nicht mehr in die Ergebnisse des SELECT geschrieben.

          Es könnte ja sein, daß z.B. am Wochende immer die News von Freitag aktuell bleiben und zwar am Montag eine News schon vorgeschrieben ist und angezeigt wird, aber am Wochenende wird dann nicht mehr auf den bestehenden Bestand zurückgegriffen.

          Der SELECT wählt ja nur die Records aus, die von heute sind, noch nicht abgelaufen sind und nicht sticky sind:
          $sql = "SELECT * FROM ".$subbase." WHERE publish='1' AND (((NOW() >= datum) AND (NOW()<killdate)) OR (sticky = 1)) ORDER BY sticky desc, datum DESC";

          Aber genau genommen bräuchte ich doch einen, der ALLE BESTEHENDEN News ausliest, die bis HEUTE im Archiv sind und dann noch diejenigen dazunimmt, die heute neu sind, ggf. bald auslaufen, und publiziert werden dürfen. Am Ende selbstverständlich nach "datum DESC" sortiert.

          Puh. Bin für jede Hilfe dankbar

          Gruss

          1. Hello,

            Aber genau genommen bräuchte ich doch einen, der ALLE BESTEHENDEN News ausliest, die bis HEUTE im Archiv sind und dann noch diejenigen dazunimmt, die heute neu sind, ggf. bald auslaufen, und publiziert werden dürfen. Am Ende selbstverständlich nach "datum DESC" sortiert.

            Dann sortier nochmal, was Du nun anzeigen willst und versuche es tabellarisch darzustellen.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hi,

              ein News Record besteht bei mir aus:

              id (INT)
              publish (0/1)
              datum (DATETIME)
              killdate (DATETIME)
              headline (TINYTEXT)
              content (TEXT)
              sticky (0/1 -> wird wohl sehr selten verwendet, aber muß sein)

              Die killdate bzw. start- Funktion kommt erst jetzt neu dazu. In der news Tabelle sind aber bereits rund 250 Einträge.

              Also habe ich mit phpmyadmin zwei weitere Spalten hinzugefügt (killdate und sticky).

              Meinst Du es wäre einfacher wenn ich noch eine weitere Spalte "startdate" hinzufüge, in der ein ggf. benötigtes zukünftiges Startdatum liegt?

              Z.Zt. sieht der SELECT ja so aus:

              $sql = "SELECT * FROM ".$subbase." WHERE publish='1' AND (((NOW() >= datum) AND (NOW()<killdate)) OR (sticky = 1)) ORDER BY sticky desc, datum DESC";

              Offen gesagt, weiß ich nicht so genau, was ich hier noch machen könnte. Nehmen wir mal an, es gäbe ein startdate in der Tabelle. Ich hab das eben mal versucht, aber ich bekomme keinen brauchbaren SELECT zusammen.

              Ich schaffe es zwar, für eine aktuelle News Start/Kill abzutesten, aber lasse damit ja alle anderen auf der Strecke, die in der Vergangenheit liegen.

              Hast Du da vielleicht noch ne Idee?

              Danke
              Gruss :)

  2. Hi,

    $sql = "SELECT * FROM ".$subbase." WHERE publish='1' AND (datum BETWEEN $redstart AND NOW()) AND (kill >= NOW()) ORDER BY datum DESC";

    Die erste Bedingung (datum BETWEEN $redstart AND NOW()) funktioniert einwandfrei, die zweite, daß sog. "Kill-Date" funzt nicht.

    Doch - die Vergleichsoperatoren >, >= usw. funktionieren einwandfrei mit Datumstypen.

    Hat jemand eine Idee, wie ich (kill >= NOW()) richtig schreibe?

    Jepp. Verwende keine Schlüsselwörter für Spaltennamen (MySQL KILL-Syntax).

    Gruß,
    Andreas.