Tagesablauf / Dienstplan

  • Hallo,

    ich suche eine Idee, wie ich am besten einen Tagesablauf / Dienstplan in einer DB speichere.

    Es gibt verschiedene Tätigkeiten (also z.B. Küchendienst, Essendienst, Aufsicht, usw...), die auf den Tag verteilt in veränderlichen Anteilen ausgeübt werden können.

    Ich würde also gerne über den Tagesablauf speichern können:


    07.00 - 07.30 Uhr Küchendienst
    07.31 - 13.00 Aufsicht
    13.01 - 15.00 Uhr Essendienst

    Wie lege ich das am besten in einer DB ab?

    Irgendwie sehe ich gerade den Wald vor lauter Bäumen nicht.

    Bisher hatte ich in Excel einen String genutzt, der je Stelle einer Viertelstunde entsprach und das an dieser Stelle stehende Zeichen stand als Abkürzung für eine Tätigkeit also z.B.

    A = Aufsicht
    K = Küchendienst
    E = Essendienst

    AAAAKKKKKKKKKKKKKKKKKKKEEEEEEEEEEEAA

    Aber das geht doch in einer DB bestimmt eleganter (und genauer als nur auf Viertelstunden genau?)

    Danke und Gruß,
    Jörg H.

  • .. das hört sich Einfach an,

    ich war bisher der Meinung, ich müsste den gesamten Tagesablauf in einer Tabelle ablegen (also auch die "leeren" Zeiten.)

    Ich will halt später einen Tag als Tabelle darstellen in der links die Uhrzeiten stehen (von oben nach unten 00:00 oben bis 23:59 Uhr unten) und daneben in einer Spalte die einzelnen Tätigkeiten farbig darstellen.

    Wie kann ich das dann bei der Abfrage die Werte für die einzelnen Zeilen (Uhrzeiten) mit der Tabelle vergleichen?

    Ich werde mal versuchen das testweise zu implementieren.

    Danke und Gruß,
    Jörg H.

  • taetigkeit: int 1
    start: int 12
    end: int 12

    Eine Spalte nennst du taetigkeit und speicherst darin eine Ziffer. Dabei steht beispielsweiße 1 für Küchendienst, 2 für Aufsicht usw.. Natürlich kannst du auch einen Buchstaben oder den ganzen Namen darin speichern.

    In start speicherst du den jetzigen Timestamp, an dem die Tätigkeit beginnt und in end den Timestamp, and denen die Tätigkeit endet.

    Ich kopiere hier mal eine Standard-Antwort aus einem anderen Forum:

    Standardantwort/FAQ:
    Um Uhrzeiten oder Daten in einer MySQL Datenbank zu speichern, sollte kein Unix-Timestamp und kein anderes komisches Format verwendet werden.

    MySQL stellt mehrere optimale Datentypen bereit:

    • DATETIME für ein Datum und eine Uhrzeit
    • TIME für eine Uhrzeit
    • DATE für ein Datum.
    • TIMESTAMP, ebenfalls für Datum und Uhrzeit. Letzterer sollte immer dann zum Einsatz kommen, wenn bei Datenveränderungen der Zeitpunkt der Modifikation gespeichert werden soll.


    Diese Datentypen haben zwei wichtige Vorteile:

    • MySQL kann hervorragend damit umgehen und Berechnungen damit durchführen z.B. Uhrzeiten voneinander abziehen. Eine komplette Funktionsreferenz findest du hier.
    • Speicherung in einem leicht lesbaren Format: YYYY-MM-DD HH:MM:SS

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Richtig :)

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Das beste deutschsprachige PHP-Forum, das ich kenne. Turne da selber auch schon länger rum.

    Ja, das ist wirklich sehr gut. Wobei auf php.de auch einige sehr kompetente Leute unterwegs sind.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Ich kopiere hier mal eine Standard-Antwort aus einem anderen Forum:

    ...kein anderes komisches Format verwendet werden...

    DATETIME hätte ich eh genommen - das ist so schön berechenbar ;)

    Danke für den Hinweis.

    Die Idee für die Speicherung der Termine/Arbeitsbereiche habe ich jetzt. Bin gerade am coden der Routine zur Anzeige (nur mal testweise). Sobald ich die fertig habe, werde ich das hier posten (wenn es funktioniert - sonst kommen halt noch ein paar Fragen).

    Danke für die Hilfe.

  • Also ICH speichere immer den Timestamp in der DB ab und Habe damit keine Problem, woher auch ich speichere ja sogesehen kein Format, lasse es dann je nachdem wie ich es haben möchte bei der Ausgabe formatieren, und 2 Zahlen lassen sich immer noch am schönsten berechnen

  • Also ICH speichere immer den Timestamp in der DB ab und Habe damit keine Problem, woher auch ich speichere ja sogesehen kein Format, lasse es dann je nachdem wie ich es haben möchte bei der Ausgabe formatieren, und 2 Zahlen lassen sich immer noch am schönsten berechnen


    Meinst du den Unix-Timestamp, in einem Integer-Feld dann, oder den SQL-Timestamp in der Form YYYYMMDDHHIISS?
    Falls ersteres: Natürlich kann man das machen,aber es geht auf Kosten der Performance. SQL ist nämlich bekanntermaßen einiges schneller als PHP. Und mit den SQL-Eigenen Datumsfunktionen lassen sich so ziemlich alle Formatierungen/Berechnungen/Umwandlungen schon von SQL erledigen, statt PHP da noch rumrödeln zu lassen. Auch die, in der von mir geposteten Standardantwort bereits angesprochene, Lesbarkeit ist für mich ein ganz klarer Pluspunkt.
    Es hat durchaus seine Gründe, dass SQL eigene Feldtypen für die Speicherung von Datums-/Zeitwerten anbietet.
    Wenn man nur Projekte hat an denen man alleine arbeitet und bei denen die Performance aufgrund niedriger Komplexität/Seitenfrequentierung keine Rolle spielt soll man das natürlich machen wie man möchte und besser mit klarkommt.
    Für professionelle Softwareentwicklung mit hoher Komplexität und für hoch frequentierte Seiten rate ich aber ganz klar zur Nutzung solch sinnvoller Konventionen wie die Verwendung der passenden und vorgesehenen Feld-Typen.
    Die Entwickler von (My)SQL bieten diese Datentypen nicht zum Spaß an, sondern haben sich durchaus etwas dabei gedacht.

    Bitte nicht falsch verstehen, ich will dir nicht in deine Programmiergewohnheiten reinreden oder diese per se schlecht machen. Ich möchte lediglich auf den Nutzen von Konventionen und vorgesehener Standard-Funktionalitäten hinweisen, da ich selbst in der Vergangenheit schon oft genug auf die Nase geflogen bin und mir ein zig-faches an Arbeit aufgehalst habe, durch Nichtbeachtung selbiger.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Naja also eine Datumsumwandlung haut nun wirklich nicht um.

    Ich finde es nicht problematisch mit INT zu arbeiten


    :!: Trotzdem sollte man sich DATETIME angewöhnen :!:


    mfg

    Einmal editiert, zuletzt von Pion (12. August 2010 um 17:12)

  • Naja also eine Datumsumwandlung haut nun wirklich nicht um.

    Ich finde es nicht problematisch mit INT zu arbeiten


    Klar, problematisch ist es nicht. Und eine Datumsumwandlung haut auch nicht um. Aber was ist mit ganz ganz vielen? :D
    Habe grad mal getestet, weil mich das tatsächliche Verhältnis auch interessiert.
    Die Umwandlung eines date-Feldes in das gewünschte Format per SQL ist 3x so schnell, wie das Auslesen eines Integer-Feldes mit einem Unix-Timestamp und der anschließenden Umwandlung ins gewünschte Format per PHP.

    Ergebnis:
    0.01239800453186
    0.037822008132935

    `regdatum` hat das Format date.
    `regdatum2` hat das Format int(12).
    Die Daten in beiden sind identisch, nur halt einmal im sql-date-format und einmal als Unix-Timestamp.
    Gefüllt ist die Tabelle mit knapp 2700 Datensätzen.


    :!: Trotzdem sollte man sich DATETIME angewöhnen :!:


    Danke, das wollte ich doch nur hören :D
    ;)

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • So und jetzt Benchmarke mal was schneller ist wenn man den Timestamp in PHP verwenden will ;)


    mfg

  • So und jetzt Benchmarke mal was schneller ist wenn man den Timestamp in PHP verwenden will ;)

    Ich steh grad aufm Schlauch, was willst du damit in PHP machen was mit SQL nicht möglich ist? Beispiele und ich Benchmarke mal. :D

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Na ich möchte den Timestamp jedes Users ausgeben als Timestamp oder für sonstige Bearbeitungen, nun sollst du mal Benchmarken ob das mit INT oder mit SQL schneller geht

    Ich würde mal tippen mit INT da MYSQL ja erst umwandeln musst^^

    mfg

  • Na ich möchte den Timestamp jedes Users ausgeben als Timestamp oder für sonstige Bearbeitungen, nun sollst du mal Benchmarken ob das mit INT oder mit SQL schneller geht

    Ich würde mal tippen mit INT da MYSQL ja erst umwandeln musst^^

    mfg

    Feld `datum`ist vom Typ datetime.
    Feld unixTimestamp vom Typ int(12).


    Ergebnis:
    0.071622133255005
    0.071276903152466

    SQL braucht nicht wirklich lange zum umrechnen eines datetime-Feldes in einen Unix-Timestamp...
    Ich sehe immer noch keinen Grund auf die vorgesehenen Feldtypen zu verzichten, selbst wenn ich in PHP tatsächlich mal den unix_timestamp benötige (was wohl eher die Ausnahme darstellen dürfte).

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook