Thomas: richtiges datum

Hallo zusammen

Ich würde gerne immer ein Eintrag aus meiner DB ausgeben lassen. und zwar immer den, dessen Feld datum das das nächste richtig datum hat.

Also zb:

datum: 20.11.2007, 27.11.2007, 30.11.2007

und heute ist der 25.11.2007 dann sollte der 27.11.2007 erscheinen.

Hoffe ich konnte mein Problem verständlich erklären.

  1. Ich würde gerne immer ein Eintrag aus meiner DB ausgeben lassen. und zwar immer den, dessen Feld datum das das nächste richtig datum hat.

    Also zb:

    datum: 20.11.2007, 27.11.2007, 30.11.2007

    Du hast die hoffentlich nicht so in der Datenbank stehn?
    Dafür gibt es den Feldtyp Date und dann kannst du einfach sortieren mit sort

    Und falls du das bei uns übliche Darstellungsformat haben willst, kannst du natürlich mit DATE_FORMAT die Ausgabe entsprechend formatieren.

    Struppi.

    1. Hallo erst mal danke, wie geht denn das mit SORT??

      Lg

      1. Hallo erst mal danke, wie geht denn das mit SORT??

        sort by feldname, du findest hier eine für dich passende doku.

        Struppi.

        1. Halo Struppi,

          Hallo erst mal danke, wie geht denn das mit SORT??

          sort by feldname, du findest hier eine für dich passende doku.

          Nix für ungut, aber es heißt ORDER BY, nicht SORT BY. ;-)

          Viele Grüße,
          Christian

          1. Hallo,

            Also wenn ich möchte dass DAtum danach in Form dd.mm.yyyy ist. dann sollte es doch etwa so gehn oder..?

            mysql_query("select * from events where DATE_FORMAT(datum,%m.%b.%Y) >= now() order by datum asc LIMIT 1");

            Lg

            1. Hallo

              Also wenn ich möchte dass DAtum danach in Form dd.mm.yyyy ist. dann sollte es doch etwa so gehn oder..?

              Nein, es geht nicht so.
              In der WHERE-Klausel verwendest Du _keine_ Formatierungsfunktion, wenn Deine
              Datenbankspalte den Datentyp DATE oder DATETIME hat.

              Du verwendest in der Spaltenliste die Formatierungsfunktion, damit Du in Deiner
              Ergebnismenge das von Dir gewünschte Datumsformat hast. Außerdem ist das Format
              eine Zeichenkette und muss daher in Anführunszeichen stehen.

              mysql_query("select * from events where DATE_FORMAT(datum,%m.%b.%Y) >= now() order by datum asc LIMIT 1");

                
              SELECT  
                  DATE_FORMAT(datum, '%m.%b.%Y') AS mydatum, -- Deine Datumsspalte im  
                                                             -- gewünschten Format  
                                                             -- mit einem netten Namen  
                                                             -- für den späteren Zugriff  
                  <sonstige Spalten>                         -- SELECT * ist böse[tm]  
              FROM  
                  events  
              WHERE  
                  datum >= NOW()        -- Vergleiche den Wert in der Spalte mit dem  
                                        -- aktuellen Datums/Zeit-Wert  
              ORDER BY  
                  datum ASC  
              LIMIT 1  
              
              

              Es ist eine gute Idee, sich nur die Spalten zurückgeben zu lassen, die man
              auch wirklich benötigt. Es scheint zunächst mehr Aufwand zu sein, die Liste
              der Spalten explizit hinzuschreiben - langfristig zahlt es sich nach meinen
              Erfahrungen aus.

              Freundliche Grüße

              Vinzenz

              1. yo,

                WHERE
                    datum >= NOW()        -- Vergleiche den Wert in der Spalte mit

                ich gebe zu, dass ich vielleicht tomaten auf den augen habe, aber werden die vergangenen datumswerte immer ausgeschlosse ? ich kann das aus seinem usprungsposting nicht erkennen. Vielleicht sollte ich auch einfach nur mal meine brille putzen oder wo ist mein denkfehler....

                Ilja

                1. Hallo Ilja,

                  ich gebe zu, dass ich vielleicht tomaten auf den augen habe, aber werden die vergangenen datumswerte immer ausgeschlosse ?

                  Ja. Du hast also keine Tomaten auf den Augen :-)

                  ich kann das aus seinem usprungsposting nicht erkennen.

                  Sicherlich ist seine Formulierung auslegungsfähig, ich zitiere:

                  dessen Feld datum das das nächste richtig datum hat.

                  dazu ein nicht eindeutiges Beispiel. Ich kann Deinen Einwand daher verstehen.

                  Ich versuche die Auslegung:
                  Heute ist Sonntag.
                  a) Der nächste Samstag ist am 1. Dezember
                  b) Der Samstag, der dem heutigen Tag am nächsten ist, ist gestern,
                     der 24. November.

                  "das nächste richtige datum" deutet halt eher in Richtung a) als in b), aber
                  ob das auch gewünscht ist, kann nur der OP klären. Die von uns geposteten
                  Statements gehen in der Tat von a) aus. Du kannst diese aber auch gern um die
                  Variante b) ergänzen.

                  Freundliche Grüße

                  Vinzenz

                  1. yo,

                    Du kannst diese aber auch gern um die
                    Variante b) ergänzen.

                    lieber abwarten, was der OP dazu sagt ;-)

                    Ilja

                    1. Hallo zusammen,

                      Also, es war a) gemeint. Nun klappt auch alles wunderbar. Danke für eure Hilfe.

                      Lg

                    2. Hello Ilja,

                      Du kannst diese aber auch gern um die
                      Variante b) ergänzen.

                      lieber abwarten, was der OP dazu sagt ;-)

                      JETZT wäre ich aber auf die Toleranzbereichslösung besonders gespannt.

                      Geht das noch in einem Statement?

                      Harzliche Grüße vom Berg
                      http://bergpost.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau
                      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                      1. Hello,

                        konnte nicht schlafen und habe noch ein bisschen gebastelt:

                        adresse:
                        ----------
                        id_adresse
                        insert_time

                        usw.

                        SET @dat ='2007-09-12';
                        select id_adresse, insert_time, abs(datediff(insert_time, @dat)) as abstand
                        from adresse
                        where insert_time = (select insert_time from adresse where insert_time < @dat order by insert_time desc limit 1) or
                              insert_time = (select insert_time from adresse where insert_time > @dat order by insert_time asc limit 1)
                        order by abstand
                        limit 1;

                        sucht die id des Datensatzes, der am nächsten zum angegebenen Datum eingefügt (insert_time) wurde, jedoch nicht am Datum selbst.

                        Kann man das mit _einem_ Statement noch anders machen?

                        Harzliche Grüße vom Berg
                        http://bergpost.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau
                        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                        1. yo,

                          Kann man das mit _einem_ Statement noch anders machen?

                          klar, gut gehst eben über die beträge bei der betrachtung, zischem dem datum in der datenbank und der aktuellen systemzeit, sortierst dann nach ihnen und das mysql typische Limit, wobei man dann aufpassen muss, dass es mehrere geben könnte. oder noch besser, mit einer unterabfrage.

                          Ilja

                          1. Hello Ilja,

                            Kann man das mit _einem_ Statement noch anders machen?

                            klar, gut gehst eben über die beträge bei der betrachtung, zischem dem datum in der datenbank und der aktuellen systemzeit, sortierst dann nach ihnen und das mysql typische Limit, wobei man dann aufpassen muss, dass es mehrere geben könnte. oder noch besser, mit einer unterabfrage.

                            Mmmh, da ist es wieder, das Problem mit der unsortierten Menge.
                            Das Datum würde hier wohl nicht wirklich ausreichen, um eine Aussage treffen zu dürfen.
                            Es könnten ja auch mehrere mit gleichem (kleinsten) Abstand sein.

                            Muss ich nochmal basteln, wie man _alle_ herausbekommt, die den kleinsten (von 0 verschiedenen) Abstand zur Stichprobe haben.

                            Harzliche Grüße vom Berg
                            http://bergpost.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                            1. Yo Tom,

                              Es könnten ja auch mehrere mit gleichem (kleinsten) Abstand sein.

                              dazu ist die unterabfrage da, sie ermittelt den kleinesten betrag (MIN) und dieser wert wird dann in der äußeren abfrage gegengeprüft, keine hexenkunst. das limit von mysql verleitet leider nur all zuschnell, weil es so praktisch ist.

                              Ilja

                              1. Hello,

                                dazu ist die unterabfrage da, sie ermittelt den kleinesten betrag (MIN) und dieser wert wird dann in der äußeren abfrage gegengeprüft, keine hexenkunst. das limit von mysql verleitet leider nur all zuschnell, weil es so praktisch ist.

                                Ich hatte das erst im äußeren Select mit min( .... ) versucht. Da habe ich immer als Antwort bekommen, dass die Funktion nicht bekannt sei.

                                Wenn man sie alleine in einer group-by-Abfrage benutzt, funktioniert sie aber.

                                Harzliche Grüße vom Berg
                                http://bergpost.annerschbarrich.de

                                Tom

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau
                                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  2. Hallo,

    Ich würde gerne immer ein Eintrag aus meiner DB ausgeben lassen. und zwar immer den, dessen Feld datum das das nächste richtig datum hat.

    Also zb:

    datum: 20.11.2007, 27.11.2007, 30.11.2007

    und heute ist der 25.11.2007 dann sollte der 27.11.2007 erscheinen.

    Hoffe ich konnte mein Problem verständlich erklären.

    Wenn Du MySQL hast und das ein Feld vom Typ DATE, DATETIME oder TIMESTAMP ist, dann kannst Du das so machen:

    SELECT * FROM tabelle WHERE datumsfeld >= CURDATE() ORDER BY datumsfeld ASC LIMIT 1

    Das LIMIT 1 sorgt dafür, dass nur 1 Datensatz zurückgegeben wird, nämlich der nächste.

    Wenn Du ein anderes DBMS benutzt, dann musst Du schauen, ob es auch etwas ähnliches wie LIMIT unterstützt (in Oracle gibt's z.B. ROWNUM). Wenn das nicht der Fall ist und Dein DBMS zumindest Subselects kann (dazu zählt auch MySQL 5), dann kannst Du folgende Abfrage verwenden:

    SELECT * FROM tabelle WHERE datumsfeld = (SELECT MIN(datumsfeld) FROM tabelle WHERE datumsfeld >= CURDATE()) ORDER BY datumsfeld ASC

    [Wobei CURDATE() durch die jeweilige "JETZT"-Funktion Deiner Datenbank zu ersetzen ist, das müsstest Du im Handbuch nachschlagen.]

    Kleiner Hinweis: Beides liefert nicht unbedingt die gewünschten Resultate, wenn Du mehrere Datensätze mit dem gleichen Datum hast:

    * Bei der LIMIT 1 Lösung wird ein zufälliger Datensatz zurückgegeben.
     * Bei der Subselect-Lösung werden alle Datensätze des gleichen Datums
       zurückgegeben.

    Wenn Du dies vermeiden willst, füge auf jeden Fall bei ORDER BY noch ein weiteres Feld hinzu, was die Sortierreihenfolge dann eindeutig macht. Dann bekommst Du bei der Subselect-Lösung immer noch mehrere Datensätze, Du kannst Dich aber nur auf den ersten beschränken und alle anderen wegwerfen.

    Viele Grüße,
    Christian

    1. yo,

      nichts für ungut, aber warum diese WHERE klausel ? Ich kann nicht erkennen, das vergangene datumswerte ausgeschlossen werden sollen. Und das bedeutet, dass man mit beträgen arbeiten muss.

      Ilja