PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : suche nach bestimmten Datum in einer Zeitspanne in vorhandener Mysql Datenbank



SAdemar
05-10-2005, 17:05
Hallo Forum,

in einer bestehenden Datenbank (MySql ) sind Datensätze mit Zeiträumen hinterlegt, wobei jeweils für das Start und Enddatum extra Spalten für Tag /Monat / Jahr vorhanden sind. Nun benötige ich eine Idee für eine Suchfunktion mit der ich mir alle Datensätze ausgeben kann wo das Datum innerhalb der Zeitspanne liegt.

Ich dank euch

Sademar

BLUESCREEN3D
05-10-2005, 18:37
wobei jeweils für das Start und Enddatum extra Spalten für Tag /Monat / Jahr vorhanden sind.
Was spricht denn dagegen, die Daten jeweils in eine Spalte zu packen?

ClausVB
05-10-2005, 19:16
Ich würde mit CONCAT (http://dev.mysql.com/doc/mysql/de/string-functions.html) die Datensätze zusammenfügen, wenn sie dafür das richtige Format haben ... (Hinweis an SAdemar: Demnächst bitte ein Beispiel angeben, danke!)

Das Ergebnis muss die Form "2005-09-31", denn so kann MySQL Daten direkt vergleichen.

Danach würde ich mit BETWEEN arbeiten:

mysql> select 1 BETWEEN 2 AND 3;
-> 0
mysql> select 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> select 2 BETWEEN 2 AND '3';
-> 1
mysql> select 2 BETWEEN 2 AND 'x-3';
-> 0 (Quelle: http://dev.mysql.com/doc/mysql/de/comparison-operators.html)

Das war's eigentlich schon.

Gruß
Claus

undefined
06-10-2005, 07:37
Ein einfache WHERE * AND Klausel reicht hier völlig aus. Dafür mußt du nicht die DB umbauen.

SAdemar
06-10-2005, 16:30
Also ein Umbau der Datenbank kommt nicht in Frage da auf dieser schon von einer anderen Anwendung genutzt wird.
Aber die Lösung mit einer and Klausel würde mich schon Interessieren. Für mehr Info immer dankbar. der Sademar :)

BLUESCREEN3D
06-10-2005, 23:47
Also ein Umbau der Datenbank kommt nicht in Frage da auf dieser schon von einer anderen Anwendung genutzt wird.
Aber die Lösung mit einer and Klausel würde mich schon Interessieren. Für mehr Info immer dankbar. der Sademar :)
OK, das wird dann aber ziemlich unübersichtlich, z.B. so:

(...) WHERE
(`start_year`<'$year' OR
(`start_year`='$year' AND `start_month`<'$month') OR
(`start_year`='$year' AND `start_month`='$month' AND start_day`<='$day'))
AND
(hier das gleiche mit umgekehrten Relationen für die Endzeiten)
$year, $month und $day sollen das aktuelle Datum bilden.

Alternativ könntest du auch aus den Datumselementen grob eine Tagesanzahl zusammenrechnen und die vergleichen:

(...) WHERE '$year'*372+'$month'*31+'$day' BETWEEN
`start_year`*372+`start_month`*31+`start_day` AND
`end_year`*372+`end_month`*31+`end_day`

Von der Möglichkeit, die drei Spalten mit CONCAT zu einem Datum zusammenzusetzen und dann damit weiterzuarbeiten würde ich dir abraten, weil das vermutlich eine schlechtere Performance hat. (Wenn man Zahlen mit Zahlen vergleichen will, sollte man die nicht zwischendurch in Strings umwandeln.)