Mailinglisten-Archive |
Hi Andy,
Am 8 Jan 2003 um 17:40 hat Andreas Stagl geschrieben:
> Dabei ist mir aufgefallen, dass ich den Jahr-Bereich des DATE Datentyps
> eigentlich garnicht bräuchte (derzeit füll ich diesen Bereich mit 2004
> auf... 2004 deshalb, weil 2004 ein Schaltjahr ist und ich somit einen 29
> Februar zur Verfügung hab).
> Deshalb wollte ich hier fragen, ob ich den DATE Datentyp noch irgendwie
> optimieren kann, sodass kein Jahr mitgespeichert wird (ich aber trotzdem
> einen 29 Februar zur Verfügung hab). Falls dies nicht geht... wäre es
> sinnvoll, anstatt des DATE Datentyps einen CHAR Datentyp zu nehmen und das
> Datum dann eben in der Form MMTT als String abzuspeichern oder würdet ihr
> eher davon abraten?
Eine Datumsfunktion zum Speichern der Tage ohne Jahr gibt's leider
nicht. Alternative: CHAR - ist aber auch blöde, denn die
Datumsfunktionen von MySQL sind n ziemlicher Hammer; wäre schade,
wenn Du die in einer kalenderähnlichen Struktur nicht anwenden
könntest.
Ein Beispiel wäre, den nächsten Namenstag anzuzeigen, der ausgehend
vom aktuellen Datum ansteht:
Die Alternative zu den MySQL-Funktionen ist natürlich eine handliche
Middleware, mit der Du das auch ganz prima erledigen kannst, wenn Du
einen CHAR-Vergleich machst. Obiges Bsp für PHP:
$heute = date(m) . "-" . date(d);
Als SQL musst Du in Deiner Struktur dann folgendes absetzen:
SELECT datum, vorname FROM namenstage
WHERE datum > $heute
ORDER BY datum ASC
LIMIT 0,1;
Nu kann man sich streiten, was sinnvoller ist. Klar ist die reine
MySQL-Variante [komplettes Datum und MySQL-Funktionen] performanter -
aber bleiben wir doch mal auf dem Teppich: Es steht zu erwarten, dass
Deine Tabelle maximal 366 Tupel mit je schätzungsweise 30 Byte
enthalten wird. [10 für Datum [komplett] und 20 für den Namen]. Das
macht ungefähr 10.7 kByte [für die ganze Tabelle!!!] Einen Index
brauchste dabei ja wohl auch eher nicht.
Bei 10,7 kByte würd ich keine großen Performancesprünge erwarten,
wenn Du das mit der grottigsten Middleware bediente
schlechtestmögliche DB-Design mit einer hochgradig optimierten Lösung
vergleichst.
Fazit: Meiner Meinung nach ist das reine Geschmackssache, welche
Lösungsvariante Du wählst. Ich persönlich würde jedoch die Version
mit dem kompletten Datum vorziehen - wegen der sauberen
Implementierung! Das Jahr musste ja nicht berücksichtigen ;-))
Übrigens: Wenn Du ein Datum in MySQL einträgst musst Du nicht darauf
achten, dass es ein Schaltjahr ist, wenn Du den 29.02. vermerken
willst. MySQL prüft nur, ob das Datum plausibel ist, d.h ob
0 < Tag < 32 und
0 < Monat < 13 und
[ beim Jahr hab ich die Grenzen jetzt nicht im Kopf! ]
Demnach kannst Du problemlos den 29.02.2001 oder den auch den
30.02.2002 eintragen. Willst Du gleich beim Eintragen prüfen, ob das
Datum überhaupt existiert - und da sind wir schon bei den MySQL-
Datumsfunktionen - musst Du beim Eintragen gleich noch ein
DateADD ausführen, bei dem Du zu dem Datum 0 Tage addierst. Dann
prüft MySQL tatsächlich auch, ob das Datum überhaupt existiert.
Manche Funktionen sind in MySQL halt ein wenig versteckt oder anders
ausgedrückt: eingebaut aber nicht sofort zu sehen. ;-))
Viele Grüße
Enrico Ortmann
[ortmann at onlineagentur-acon.com]
--------------------------------------------------------
ACON Onlineagentur & Multimedia
Dorfstr. 34 // 16348 Ruhlsdorf
Fon/Fax: +49-33305-71236/-71237
http://www.onlineagentur-acon.com
--
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive