Weiter Zurück [Inhalt] Online Suche im Handbuch

31.12 Berechnung von DATUM

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.


Weiter Zurück [Inhalt] Online Suche im Handbuch