Archiv verlassen und diese Seite im Standarddesign anzeigen : where Abfrage
Hallo,
ich habe ein Selectfeld mit einer jahresangabe.
$timeform .= '<select name="year" ><option value="0"></option>';
for( $i = 2002; $i <= 2025; $i++ )
{
$timeform .= '<option value="' . $i . '"' . ( $i == $year ? ' selected' : '' ) . '>' . $i . '</option>';
}
$timeform .= '</select>';
In der Datenbank ist das Datum (dateday) mit 0000-00-00 abgespeichert.
Jetzt möchte ich eine Auflistung, wo alle Einträge aufgezählt sind,
die z.B. das Jahr 2003 haben.
SELECT DISTINCT ........, date.dateday, ...... FROM tabelle1 As user, tabelle2 As date WHERE user.userid=date.userid AND substr(date.dateday,0,4)=$year ORDER BY date.dateday " );
Der Fehler liegt sicherlich beim substring??
EDIT
Ich habe zum testen dieses eingefügt, und mich somit auf einen
bestimmten Datenbankeintrag bezogen:
AND date.dateday = 2003-06-13
bekomme aber trotzdem alle Datenbankeinträge angezeigt ???
muß natürlich '2003-06-13' heißen, dann klappts, also Fehler
doch im substring?
/EDIT
Gruß
Heiner
probier doch mal
...AND substr(date.dateday,0,4)='2003'...
dann wießt du zumindest, ob es am substr() liegt.
Hallo,
nach deinem Beispiel:
AND substr(date.dateday,0,4)='2003'
kommt das hier:
MySQL: You have an error in your SQL syntax
near '(date.dateday,0,4) = '2003' ORDER
gebe ich zum Testen ein:
AND date.dateday = '2003-06-13'
dann funktioniert es, es wird dieser Datensatz angezeigt.
EDIT
Noch ein Test:
$test = substr(date.dateday,0,4);
im Abfrage string: AND $test='2003'
Fehlermeldung: Unknown column 'date' in 'where clause'
das gibt dann "date" aus, es wird als das Wort zerlegt,
bei 0,2 wir "da" ausgegeben, und nicht der Wert der Spalte??
bei :
$test = intval(substr(date.dateday,0,4));
wird "0" ausgegeben.
Falls es bei der oberen keine Lösung gibt, bin
ich da jetzt etwas anders herangegangen.
Dazu muß ich aber das Format aus der Datenbank 0000-00-00
umwandeln in einem Timestamp 0000000000
Wie kann man das machen?
1. Du speicherst in die Datenbank gleich den Timestamp rein
$time=time();
2. Du wandelst mit dateformat das datum um.
Bei 2 bin ich mir net sicher bin anfänger.
Edit:
Aber es müsste doch auch mit LIKE gehen oder?
$select = ("SELECT * FROM deine_tabelle_oder_auch_nicht_grins LIKE 2003%");
mysql_query($select,$verbindung);
Das Feld dateday ist welchen Feldtyps? Etwa Character?
Wenn ja solltest Du nach DATE konvertieren.
Wenn es sich um DATE oder DATETIME handelt stehen Dir doch alle datumspezifischen Abfrage- und Berechnungsmöglickeiten zur Verfügung.
Die Abfrage könnte dann wie folgt aussehen:
SELECT DISTINCT ........, date.dateday, ...... FROM tabelle1 As user, tabelle2 As date WHERE user.userid=date.userid AND YEAR(date.dateday)=$year ORDER BY date.dateday " );
http://www.mysql.com/doc/D/a/Date_and_time_functions.html
http://www.mysql.com/doc/D/A/DATETIME.html
Ansonsten würde ich mal den substring() wie folgt probieren:
.... AND substring(date.dateday,1,4) = '2003' ...
1. In der Select-Anweisung substring() anstatt substr().
2. Der SQL-Substring ist nicht nullrelativ!
http://www.mysql.com/doc/S/t/String_functions.html
Vielen Dank für die Hilfe, jetzt habe jedoch bereits alles
umgeschrieben und die Auflistung von Terminen nach
Monat und Jahr über eine checkbox namens "period gemacht.
Auf der Seite habe ich 2 selectfelder, Monat und Jahr.
So habe ich es versucht, searchstart und searchend funktionieren
und geben den richtigen Zeitpunkt aus.
Nur das Datum in der Datenbank 0000-00-00 wird immer
noch nicht in einen Timestamp umgewandelt 0000000000
if( $period == "yes" )
{
$searchstart = mktime(0, 0, 0, $startmonth, 1, $startyear);
$searchend = mktime(0, 0, 0, $startmonth + 1, 0, $startyear);
$date = mktime(0, 0, 0, substr(date.dateday, 5,2), substr(date.dateday, 8,2), substr(date.dateday, 0,4));
$zusatz = "AND ($date>$searchstart AND $date<$searchend)";
nochmal umgeschrieben:
so gehts auch, ohne das Datum der Datenbank umzuwandeln.
if( $period == "yes" )
{
$searchstart = sprintf ("%04d-%02d-%02d", $startyear, $startmonth, 1);
$searchend = sprintf ("%04d-%02d-%02d", $startyear, $startmonth + 1, 1);
$zusatz = "AND (date.dateday>$searchstart AND date.dateday<$searchend)";
}
dabei kommt heraus:
AND (date.dateday>2002-01-01 AND date.dateday<2002-02-01)
also ist jetzt bei date.dateday der Fehler.
@Heiner: Nur leider ist ein solche Vorgehen absolut nicht sinnvoll ... ein RDBMS gibt uns Datentypen, die für die Verwaltung entsprechender Daten auch verwendet werden sollten ...
... und wenn Du schon Strings vergleichen willst ... dann so:
$zusatz = "AND (date.dateday>'$searchstart' AND date.dateday<'$searchend')";
@goth
Vielen Dank,
jetzt funktioniert es.
Ich bin da noch am Anfang mit meinen Scripten,
deshalb weiß ich auch nicht genau welches
Vorgehen nun das Beste ist.
Ich hoffe diese nun endlich funktionierende
Variante der selektierten Auflistung von
Datenbankeinträgen verursacht keine Probleme.
|
-
- |