richtiges datum
Thomas
- datenbank
0 Struppi0 thomas
3 Christian Seiler0 Ilja
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.
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.
Hallo erst mal danke, wie geht denn das mit SORT??
Lg
Hallo erst mal danke, wie geht denn das mit SORT??
sort by feldname, du findest hier eine für dich passende doku.
Struppi.
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
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
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
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
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
yo,
Du kannst diese aber auch gern um die
Variante b) ergänzen.
lieber abwarten, was der OP dazu sagt ;-)
Ilja
Hallo zusammen,
Also, es war a) gemeint. Nun klappt auch alles wunderbar. Danke für eure Hilfe.
Lg
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
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
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
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
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
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
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
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