![]() ![]() ![]() |
Online Suche im Handbuch | ![]() |
MySQL besitzt einige Funktionen, mit denen man mit Daten rechnen kann, z.B. um das Alter zu errechnen, oder um spezielle Datumsangeben auszusortieren. Berechnen wir also einfach mal das Alter unserer Tieren manuell nach einer einfachen Formel: Differenz in Tagen, dividiert durch 365. Es d�rfte klar sein, da� hiermit wohl kaum Schaltjahre und die besonderen Schaltjahre alle 400 Jahre einbezogen sind. Jahr 2000 fest ist diese Formel als nicht. MySQL mit allen seinen Funktionen ist aber Jahr2000 fest, also keine Panik. Alle Datenbanken in der Industrie, die mit MySQL aufgebaut wurden, k�nnen also Silverster/Neujahr 2000 weiterlaufen. Viele Unternehmen in der Chemiebranche setzen diese z.B. f�r die Qualti�ts�berwachung ein. Hier f�r ist MySQL geradezu pr�destiniert.
Ein Beispiel:
mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(geboren))/365 FROM tier; +----------+---------------------------------------+ | name | (TO_DAYS(NOW())-TO_DAYS(geboren))/365 | +----------+---------------------------------------+ | Fluffy | 6.15 | | Claws | 5.04 | | Buffy | 9.88 | | Fang | 8.59 | | Bowser | 9.58 | | Chirpy | 0.55 | | Whistler | 1.30 | | Slim | 2.92 | | Puffball | 0.00 | +----------+---------------------------------------+
Die Ausgabe hat nun einen kleinen Sch�nheitsfehler: Die nette Formel, die wir angegeben haben, erscheint dummerweise in der Ausgabe. Wir korrigieren das durch die Angabe von AS. AS wird auch Spalten Alias genannt:
mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(geboren))/365 AS alter -> FROM tier ORDER BY name; +----------+--------+ | name | alter | +----------+--------+ | Bowser | 9.58 | | Buffy | 9.88 | | Chirpy | 0.55 | | Claws | 5.04 | | Fang | 8.59 | | Fluffy | 6.15 | | Puffball | 0.00 | | Slim | 2.92 | | Whistler | 1.30 | +----------+--------+
Wir haben nun ein sch�nes Ausgabeformat. Wer CGI-BIN�s schreibt oder mit PHP3 programmiert, der wird den Operator AS h�ufiger benutzen m�ssen. Die Zahl der Zeilen, die wiederverwendet werden k�nnen, steigt. Um die Ausgabe noch perfekt zu machen, m�ssen wir noch sortieren:
mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(geboren))/365 AS alter -> FROM tier ORDER BY alter; +----------+------+ | name | alter| +----------+------+ | Puffball | 0.00 | | Chirpy | 0.55 | | Whistler | 1.30 | | Slim | 2.92 | | Claws | 5.04 | | Fluffy | 6.15 | | Fang | 8.59 | | Bowser | 9.58 | | Buffy | 9.88 | +----------+------+Man mu� schon genau hinsehen, um festzustellen, da� man auch nach dem Alias sortieren kann.
Wie schaut es denn nun mit toten Tieren aus ? Wir haben eines in der Tabelle, Bowser. Lassen wir uns also alle Tiere ausgeben, die schon gestorben sind:
mysql> SELECT name, geboren, gestorben, (TO_DAYS(gestorben)-TO_DAYS(geboren))/365 AS alter -> FROM tier WHERE gestorben IS NOT NULL ORDER BY alter; +--------+------------+------------+------+ | name | geboren | gestorben | alter| +--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5.91 | +--------+------------+------------+------+
Die Abfrage benutzt den Ausdruck gestorben IS The query uses gestorben IS NOT NULL und nicht gestorben != NULL, weil NULL ein spezieller Ausdruck ist, n�mlich ein Platzhalter. W�hrend in der Mathematik sagen kann "nicht null" ist dies bei einem Platzhalter nicht so einfach m�glich.
In der Paraxis k�nnten noch weitere Abfragen interessant sein, z.B. welche Tiere im n�chten Monat Geburtstag haben. F�r diese Abfrage sind Tag und Jahr ohne Bedeutung, da ja nur nach dem Monat gefragt ist. Die Konvertierung TO_DAYS(DATE) hatten wir stillschweigend eingef�hrt, nun f�hren wir einfach weitere Funktionen ein: YEAR(DATE), MONTH(DATE), DAY(DATE):
mysql> SELECT name, geboren, MONTH(geboren) FROM tier; +----------+--------------+----------------+ | name | geboren | MONTH(geboren) | +----------+--------------+----------------+ | Fluffy | 1993-02-04 | 2 | | Claws | 1994-03-17 | 3 | | Buffy | 1989-05-13 | 5 | | Fang | 1990-08-27 | 8 | | Bowser | 1989-08-31 | 8 | | Chirpy | 1998-09-11 | 9 | | Whistler | 1997-12-09 | 12 | | Slim | 1996-04-29 | 4 | | Puffball | 1999-03-30 | 3 | +----------+--------------+----------------+ <verb> <p> Auf diese Art kann man auch Geburtstage in einem bestimmten Monat finden: <verb> mysql> SELECT name, geboren FROM tier WHERE MONTH(geboren) = 5; +-------+------------+ | name | geboren | +-------+------------+ | Buffy | 1989-05-13 | +-------+------------+ <verb> <p> Man kann auch nach Zeitinterwallen suchen: <p> <verb> mysql> SELECT name, geboren FROM tier -> WHERE MONTH(geboren) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
mysql> SELECT name, geboren FROM tier -> WHERE MONTH(birth) = MOD(MONTH(NOW()),12) + 1;
Die Statements sind nicht alle identisch. Wenn man sich diese Ausdr�cke einmal genauer ansieht, dann wird zuerst nach dem Zeitinterwall der n�chten 29/30/31 Tage gesucht, im zweiten Beispiel wird mit dem Operator MODULO (MOD) gearbeitet. Es wird nach dem n�chsten Monat gesucht, ab dem Ende diesen Monats.
![]() ![]() ![]() |
Online Suche im Handbuch | ![]() |