phpbar.de logo

Mailinglisten-Archive

[php] Doofer MySQL Timestamp SELECT (Veranstaltunskalende

[php] Doofer MySQL Timestamp SELECT (Veranstaltunskalende

Martin Franz martin_(at)_franz63.de
Tue, 16 Jan 2001 12:59:03 +0100


Hey Theo,

> Wenn auch etwas informatiklastik ;)

;-) naja - also Im ersten Semester lernt man sowas eigentlich granicht -
sind eher Überreste meiner C Kenntnisse.

> > CRON hat eigentlich ein recht leistungsfähiges System um seine Termine
zu
> > koordinieren.
> > Er verwendet folgendes format:
>
> > 5 Werte, durch Lerzeichen getrennt
> > - Minute (0-59)
> > - Stunde (0-23)
> > - Tag des Monats (1-31)
> > - Monat im Jahr (1-12)
> > - Tag der Woche (0-6) // 0=Sonntag, 6=Samstag
>
> > Zitat UNIX, Markt&Technik, 93':
>
> Aha, ich glaub das Buch muss ich mir mal ansehen. ;)

Ist nur ein kleines Handbuch, aber praktisch wenn man mal grade die
Man-Pages nicht zur Hand hat und ein Paar weiterführende Beispiele braucht.
Meins hier kostet 39.-DM bin aber sicher dass man sowas auch günstiger
bekommt.

> > Was hältst Du davon?
> [...]
>
> > Um die Werte zu erzeugen Setzt man sich am besten Konstanten und
verwendet
> > Bitmasken, also z.b.
> > $JANUAR = 1;
> > $FEBRUAR = 2;
> > $MÄRZ = 4;
> > $APRIL = 8;
> > $MAI = 16;
> > $JUNI = 32;
> > $JULI = 64;
> > ....

Mir ist aufgefallen dass ich im letzten Mail einen Fehler gemacht hatte -
Bitmasken müssen natürlich immer ODER-verknüpft werden - nicht AND, sonnst
wird das nix
.. also $wert = $JANUAR | $FEBRUAR | MÄRZ...

> Hmm, ich meine codieren ist die Lösung, zumindest was die >wiederkehrenden
Varianten
> verwaltet. Aber wo liegt der Vorteil in Bit-codierung. (so doof kann nur
ein
> Nichtinformatiker fragen, oder?)  Cron machts offensichtlich ja auch im
>"Klartext".

Ach, einerseits möchte ich mein Studium nicht so in den Vordergrund
stellen - vieles von dem hier hab ich auch garnicht an der Uni gelernt :-)
und andererseits sollte ein Informatiker ja auch in der Lage sein sein
Wissen in verständlicher Form präsentieren zu können. (ich glaub das können
an der Uni wenige ;-)) )
Nunja - also das Prinzip beruht eigentlich nur auf etwas Rechnen in
Binärdarstellung (sowas lernt man auch auf der Schule, gelegentlich)
Boolscher Algebra (gut ok, das hab ich ausm Studium, ist aber wirklich
einfach) Und etwas Kreativität :-)
Ja - der Vorteil: angenommen Du stellt die Cron Darstellung in einer
Datenbank dar - sagen wir auch mit 5 Feldern für (monat, tag, stunde,
minute, wochentag) und angenommen Du willst einen Event darstellen der sagen
wir Januar bis August stattfindet - laut cron könntest du jetzt in das
"monat" feld also "1-8" reinschreiben. oder "1,2,3,4,5,6,7,8" wenn es jetzt
nur alle 2 Monate stattfindet bleibt Dir schon nix anderes mehr übrig als
"1,3,5,7" reinzuschreiben - fürchterlich viel ASCII Salat also. Und das
schlimmste - Du tust dir irre schwer nach diesem Feld etwas zu selecten,
richtig? wenn Du jetzt wissen willst was alles im Februar abgeht müsstest du
dieses Varchar Feld jetzt irgendwie nach ,2, oder 2, oder wie auch immer
durchsuchen - das gibt dann aber wieder Probleme mit 12 und ist obendrein
noch langsam.
Und der Varchar - der maximal 23 Stellen (also 23 Byte) braucht, ist ne irre
Platzverschwendung. Also nimmst Du Dir zwei schnuckelige Bytes - also 16 Bit
und sagst - jedes Bit stellt einen Monat dar - bleiben 4 Bit übrig, macht
aber nix. Wenn jetzt ein Event von Januar bis August läuft - setz ich
einfach Bits Nummer 1 bis 8 auf "1" und lass den Rest auf 0. also das Ding
sieht jetzt so aus:
0000000011111111
Dezimal: 256 (empfehlung Windoof Taschenrechner im Wissenschafts-Modus, kann
umrechnen)
So, jetzt noch der Schnellkurs im Binärsystem:

Wenn ich jetzt wissen will, ob dieser Event im Mail auch stattfindet - gehe
folgendermassen vor:
Mai ist das Bit Nummer 5 - also muss ich jetzt abfragen ob Bit Nummer 5 Eins
ist. - und das geht so:
eine Binärzahl die das 5te Bit auf eins hat: 10000 - 16 dezimal in eine
Variable Ablegen:
$wert = 16;
und das ganze per AND mit den obigen 16 Bit verknüpfen - sieht also so aus:
0000000011111111
0000000000010000
&_______________
=0000000000010000

($monat & $wert) > 0;
ist also auch wieder 16 und damit grösser 0. Also hab ich rausgefunden Dass
Bit 5 Eins ist, und der Event im Mai stattfindet.
(wäre das Bit Nummer 5 "0" würde bei der & Verknüpfung 0 rauskommen)
Mit solchen Bitmasken kann ich jetzt alles mögliche abfragen.
Halbwegs verstanden? - es funktioniert - glaub mir. Und es ist um einiges
leichter zu handhaben als irgendwelche strings nach Zahlen zu durchsuchen.
Problem ist jetzt noch die Dauer in jedem Fall richtig zu codieren - wenn
etwas von 15:00 bis 15:30 geht ist das nicht so schlimm, unangenehm wirds
erst wenn ich 15:30 bis 16:15 codieren will - dann hab ich sozusagen einen
"Stunden-umbruch" und hab im Minuten-Bitfeld mehrere Bereiche von Einsen,
die ich richtig interpretieren muss - da bin ich noch am grübeln wie man das
dann am elegantesten löst.

so far,
martin





php::bar PHP Wiki   -   Listenarchive