phpbar.de logo

Mailinglisten-Archive

[php] Wie finde ich einen zeitlich relevanten Eintrag in MySQL?

[php] Wie finde ich einen zeitlich relevanten Eintrag in MySQL?

Carlo carlo97 at arcor.de
Mit Okt 1 02:08:17 CEST 2008


Hallo Cris,

> Zeit Zählerstand  Diff
> 01.01. 5000 0
> 02.01. 5010 10
> 03.01. 5020 20
> 04.01. 0    30 (Zählerwechsel bei 5030)
> 05.01. 10   40
> 06.01. 20   50
da steckt ein Denkfehler drin, der Zählerwechsel benötigt
zwei Eintragungen, siehe weiter unten.

> Wenn jetzt als nächstes der Zählerstand am 08.01. kommt, ich
> aber den vom 07.01. nachreichen will stoße ich auf das Problem.
nöö ;-)

Und nun mein Beispiel:
CREATE TABLE elektro (
  zeit    datetime NOT NULL default '0000-00-00 00:00:00',
  stand   int(11) NOT NULL default 0,
  PRIMARY KEY (zeit)
) TYPE=MyISAM;

INSERT INTO strom (zeit, stand) VALUES # die Basis
 ('2008-01-01 13:57:14', 5001),
 ('2008-01-02 14:46:25', 5012),
 ('2008-01-03 15:35:36', 5023),
 ('2008-01-04 16:24:47', 4),
 ('2008-01-05 17:13:58', 15),
 ('2008-01-06 18:02:09', 26);
INSERT INTO strom (zeit, stand) VALUES # Nachtrag Zählerwechsel
 ('2008-01-04 15:57:33', 5037);
INSERT INTO strom (zeit, stand) VALUES
 ('2008-01-08 11:47:11', 48);
INSERT INTO strom (zeit, stand) VALUES # Nachtrag
 ('2008-01-07 11:23:33', 39);

mysql> select * from strom;
+---------------------+-------+
| zeit                | stand |
+---------------------+-------+
| 2008-01-01 13:57:14 |  5001 |
| 2008-01-02 14:46:25 |  5012 |
| 2008-01-03 15:35:36 |  5023 |
| 2008-01-04 16:24:47 |     4 |
| 2008-01-05 17:13:58 |    15 |
| 2008-01-06 18:02:09 |    26 |
| 2008-01-04 15:57:33 |  5037 |
| 2008-01-08 11:47:11 |    48 |
| 2008-01-07 11:23:33 |    39 |
+---------------------+-------+
zeigt, dass alles schön durcheinander steht, und das ist gut so.
Datenbanktabellen sind definitionsgemäß ordnungslose Mengen.
Und nun versuche ich eine Abfrage zu bauen, die Dir zu jeder Zeit
verwendbare Werte ausgibt, also auch zwischen den Nachträgen.

Zuerst brauchen wir eine Variable:
SET @older=4987;  # ein älterer Zählerstand

Und dann kann es losgehen:
  SELECT zeit, stand,
      IF (@older < stand, stand - @older, 0) AS verbrauch,
      (@older := stand) AS help
    FROM strom
ORDER BY zeit;
+---------------------+-------+-----------+------+
| zeit                | stand | verbrauch | help |
+---------------------+-------+-----------+------+
| 2008-01-01 13:57:14 |  5001 |        14 | 5001 |
| 2008-01-02 14:46:25 |  5012 |        11 | 5012 |
| 2008-01-03 15:35:36 |  5023 |        11 | 5023 |
| 2008-01-04 15:57:33 |  5037 |        14 | 5037 |
| 2008-01-04 16:24:47 |     4 |         0 |    4 |
| 2008-01-05 17:13:58 |    15 |        11 |   15 |
| 2008-01-06 18:02:09 |    26 |        11 |   26 |
| 2008-01-07 11:23:33 |    39 |        13 |   39 |
| 2008-01-08 11:47:11 |    48 |         9 |   48 |
+---------------------+-------+-----------+------+
Wie man sieht kann man jederzeit Werte in die Tabelle nachtragen,
ohne dass es zu Fehlern kommt. Wünschenswert wäre eventuell noch
eine Ausgabe der Dauer in Stunden, damit größere Zeiträume sofort
ins Auge fallen. Aber ich will Dir nicht alles wegnehmen ;-)


mit bestem Gruß Carlo 



php::bar PHP Wiki   -   Listenarchive