MySQL Query und Typenumwandlung
beinaendiOhnePasswort
- php
Ich brauche eine MySQL Abfrage, die eine timestamp Spalte ausliest und den timestamp als Zahl mit einer anderen Zahl vergleicht:
$result = mysql_query("select * from data where carId='" . $car . "' and timestamp >= " . $lowLimit . " order by timestamp asc") or die ("shit");
Nun lässt sich aber die Spalte timestamp nicht so einfach mit der Zahl (Double) $lowLimit vergleichen. Irgendwie müsste ich da wohl noch eine Typenumwandlung vornehmen, wie bitte aber geht das mit MySQL?
Hello,
Nun lässt sich aber die Spalte timestamp nicht so einfach mit der Zahl (Double) $lowLimit vergleichen. Irgendwie müsste ich da wohl noch eine Typenumwandlung vornehmen, wie bitte aber geht das mit MySQL?
Was soll denn überhaupt ermittelt werden?
Timestamp ist in MySQL eigentlich ein zusammengesetzter Datentyp.
YYYYMMDDHHmmss
Y Jahr
M Monat
D Tag
H Stunde
m Minute
s Sekunde
Er wird immer 14-stellig ausgeschriben und man kann ihn daher leicht mit substr() auseinandernehmen.
Da PHP ja eine automatische Typumwandlung vornimmt, kanns Du dann nach belieben mit einer Zahl vergleichen und/oder damit rechnen. In MySQL geht das mit substring() ganuso. Da musst Du aber daran denken, dass der Index bei 1 anfängt zu zählen.
Wenn Du in MySQL eine Umwandlucn mit UNIX_TIMESTAMP(timestampspalte) vornimmst, dneke daran, dass die Wertebereiche nicht gleich sind, es also irgendwann Fehler geben wird.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom
Eigentlich wusste ich das alles was du geschrieben hast bereits, ausser einer Kleinigkeit, das mit der automatischen Umwandlung. Denn genau dort liegt ja der Hund begraben. Ich vergleiche einen Timestamp in dem von dir angegebenen Format mit einem Double und will alle Timestamp Datensätze aus einer Tabelle abrufen, deren Wert Grösser ist als der, der Variablen.
In der Variablen steckt genau so ein Wert drin: 20041024140356 und ich will alle Zahlen aus der Timestamp Spalte die Grösser sind als dieser Wert. Irgendwo liegt aber ein Problem drin, weil er das nicht schafft. Dachte ich müsse die timestamp Spalte noch in einen anderen Typen umwandeln, damit es funktioniert.
Zur Erinnerung: das ist die Abfrage:
$result = mysql_query("select * from data where carId='" . $car . "' and timestamp >= " . $lowLimit . " order by timestamp asc");
Wenn ich "and timestamp >= " . $lowLimit . "" weglasse, funktioniert es einwandfrei!
Danke,
beinaendi
Hello,
Zur Erinnerung: das ist die Abfrage:
$result = mysql_query("select * from data where carId='$car' and timestamp >= $lowLimit order by timestamp asc");
Das funktioniert so auch.
Dein Vergelichstyp muss nur auch 14 Stellen haben, wenn es sinnvoll sein soll.
Ich habs bei extra nochmal ausprobiert:
select * from ADRESSE where FIRSTCLICK < 20030000000000;
such t alle Datensätze, die vor dem Jahr 2003 angelegt wurden.
MySQL vergleicht den Typ Timestamp als Zahl, obwohl er ja zusammengesetzt ist. Sollte dieser Wert von außen kommen, dann schick ihn auf jeden Fall in der PHP-Schnittstelle durch intval($lowlimit), um Injection zu verhindern.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
$result = mysql_query("select * from data where carId='$car' and timestamp >= $lowLimit order by timestamp asc");
Allerdings darfst Du die Spalte nicht "timestamp" nennen. Das Wort ist reserviert.
Abschnit 7.1.6. http://dev.mysql.com/doc/mysql/de/Reserved_words.html
Harzliche Grüße aus http://www.annerschbarrich.de
Tom