nur Datensätze der nächsten 2 Wochen ausgeben
Christoph
- php
Hallo,
ich habe eine Tabelle "seminare" da stehen allerhand Daten drin von Seminaren. Unter anderem auch ein Datum in der Form: "30.11.03" halt ohne die " . Ok es gibt nämlich noch ein Admintool wo man die Seminare einpflegen kann und das Datum wird manuell hineingeschrieben.
Jetzt möchte ich auf der jeweiligen Homepage nur die Seminare ausgeben von den nächsten 2 Wochen.
Wenn ich das so schreibe:
$lq = mysql_query("SELECT * FROM seminare WHERE datum > date_add(current_date, interval -14 day)") OR die(mysql_error());
dann gibt er mir trotzdem alle aus ;(
Weiß jemand Rat?
Vielen Dank
Gruß cg
Hallo.
datum > date_add(current_date, interval -14 day)")
Deine Formate kolledieren etwas. datum ist 301103 wenn ich Dich richtig verstanden habe. Laut Doku :
"CURRENT_DATE()
Returns the current date as a value in 'YYYY-MM-DD' or YYYYMMDD format,"
Dein vergleich wäre also 301103 < 20031114 - und das ist für alle 6stelligen Seminardatums gültig.
Grüße aus Würzburg
Julian
Hello,
Wenn ich das so schreibe:
$lq = mysql_query("SELECT * FROM seminare WHERE datum > date_add(current_date, interval -14 day)") OR die(mysql_error());
Du hast zwar nicht geschrieben, welches DBMS Du verwendest, aber ich rate mal, dass es MySQL ist.
Welchen Datentyp hat denn dein "Datumsfeld"? Deiner Beschreibung nach muss das ja ein Text-Typ sein. Das ist aber sehr ungünstig. Warum nimmst Du nicht DateTime? Damit funktioniert dann auch die Datumsrechnung.
Grüße
Tom
Hallo,
Du hast zwar nicht geschrieben, welches DBMS Du verwendest, aber ich rate mal, dass es MySQL ist.
ja MySQL :)
Welchen Datentyp hat denn dein "Datumsfeld"? Deiner Beschreibung nach muss das ja ein Text-Typ sein. Das ist aber sehr ungünstig. Warum nimmst Du nicht DateTime? Damit funktioniert dann auch die Datumsrechnung.
Ok Daumsfeld ist Varchar. Wie schon gesagt speichere ich das Datum im Format 31.11.03 ab und genauso stehts auch in der DB und auch nicht 311103 oder irgendwie anderser sonder nur so. Leider weil die weil es ja das Datum ist wann das Seminar anfängt. Kann ich das Datum vielleicht umwandeln wenn ich es abspeichere? Oder gibt es eine andere Alternative?
Grüße
cg
Hello,
Ok Daumsfeld ist Varchar. Wie schon gesagt speichere ich das Datum im Format 31.11.03 ab und genauso stehts auch in der DB und auch nicht 311103 oder irgendwie anderser sonder nur so. Leider weil die weil es ja das Datum ist wann das Seminar anfängt. Kann ich das Datum vielleicht umwandeln wenn ich es abspeichere? Oder gibt es eine andere Alternative?
Da gibt's verschiedene Philosophien (darf man das eigentlich inzwischen mit F schreiben?):
Datum in drei Feldern erfassen und ausgeben. Dann kann man es auch einfacher überprüfen. Oder sich mal die Funktion strtotime() anschauen. Die leistet auch schon einiges.
Oder eben eine eigene Funktion schreiben für die Datumsvalidierung und Wiederherstellung (Anzeige).
In der DB sollte es wegen der Vergleichbarkeit aber mindestens im ANSI-Format 20031231 für den 31.12.2003 abgespeichert werden. Und da ist doch der Schritt zu 2003-12-31 auch nicht mehr weit. Damit kann die DB dann leben.
Ich würde eine neue Spalte mit dem Typ Datetime einführen und der den Wert aus der alten zuweisen.
alter table <tabellenname> add <spaltenname> datetime;
update <tabellenname> set <spaltenname> = concat("20",substring(<altesplate>,7,2),"-",substring(<altespalte>,4,2),"-",substring(<altespalte>,1,2));
nach einem kontollierenden Select...
alter table <tabellenname> drop <altespalte>;
alter table <tabellenname> change <spaltenname> <altespalte> datetime;
Probiers bitte vorher an einer Testtabelle aus.
Aber so müsste das Konvertieren klappen.
Die Eingabe kannst Du ja torzdem so lassen, musst dann eben vor dem Speichern nur eine Konvertietung des Feldinhaltes durchführen:
data[startdat] ist das textfeld im form
if (isarray($_POST["data"]["startdat"]))
{
$a_startdat = explode(".",$_POST["data"]["startdat"]);
}
if (count($a_startdat == 3))
{
$date=array();
if (strlen($a_startdat[2])==2)
{
$date[year]="20".$a_startdat[2];
}
elseif(strlen($a_startdat[2])==4)
{
$date[year]=$a_startdat[2];
}
else
{
## Fehlerbehandlung
return false;
}
## usw für Monat $date[1] und Tag $date[2]
}
else
{
## Fehlerbehandlung
}
$date = implode("-",$date);
---------------------------------
So ungefähr könnte Deine Funktion aussehen.
Man könnte dann auch noch einen checkdate() verwenden, um das Datum auf Validität zu prüfen.
bool checkdate ( int Monat, int Tag, int Jahr)
So müsstest Du aber zurecht kommen
Grüße
Tom
Hallo
so ich habe jetzt mal das Datumsfeld umgewandelt und meine SQL Anweisung auch mal umgeschrieben:
$lq = mysql_query("SELECT * FROM seminare AS s WHERE s.datum > CURDATE() AND s.datum < DATE_ADD(CURDATE(), INTERVAL 14 DAY) ORDER BY s.datum ASC") OR die(mysql_error());
Jetzt holt er alles was die nächsten 14 Tage drin ist, also verglichen mit dem Datum, raus, nur komisch er verweigert mit auch die Seminare die eventuell heute anlaufen mir auszugeben. Nur ab morgen...
Grüße
cg
Hello,
$lq = mysql_query("SELECT * FROM seminare AS s WHERE s.datum > CURDATE() AND s.datum < DATE_ADD(CURDATE(), INTERVAL 14 DAY) ORDER BY s.datum ASC") OR die(mysql_error());
Jetzt holt er alles was die nächsten 14 Tage drin ist, also verglichen mit dem Datum, raus, nur komisch er verweigert mit auch die Seminare die eventuell heute anlaufen mir auszugeben. Nur ab morgen...
Na, das hat Du doch auch in Auftrag gegeben: WHERE s.datum > CURDATE()
schreib doch WHERE s.datum >= CURDATE()
Grüße
Tom