stefan: Datenbankdesign

hallo,
ich bin am grübeln wie ich am besten eine Termin-Datenbank strukturiere.
Genauer hab ich Probleme mit dem Datumsfeld.
Der User hat die Möglichkeit Anfang und Ende eines Events einzugeben, mit den Datumsangaben "von" "bis", die ich in zwei Spalten abspeichere.
Über eine Abfrage kann der User sich dann bestimmte Events nach Monat anzeigen lassen.
Das Problem ist, dass ich den Monat mit Zahlenangaben abspeichere, also von 01-12. Bei der Abfrage suche ich dann mit LIKE nach entsprechenden Datensätzen. Leider bekomme ich dann auch Ergebnisse, wo im Tag eine 01-12 vorkommt.
Nun meine Frage: Ist es sinnvoll die Datumsangeben in jewils drei Spalten abzuspeichern, um solche Fehlausgaben zu vermeiden?
Also je eine Spalte für Tag, Monat, Jahr.
Oder gibt es einen eleganteren Lösungsansatz.
Für Tips bin ich euch sehr dankbar.
Beste Grüße
Stefan

  1. Das Problem ist, dass ich den Monat mit Zahlenangaben abspeichere, also von 01-12. Bei der Abfrage suche ich dann mit LIKE nach entsprechenden Datensätzen. Leider bekomme ich dann auch Ergebnisse, wo im Tag eine 01-12 vorkommt.
    Nun meine Frage: Ist es sinnvoll die Datumsangeben in jewils drei Spalten abzuspeichern, um solche Fehlausgaben zu vermeiden?
    Also je eine Spalte für Tag, Monat, Jahr.
    Oder gibt es einen eleganteren Lösungsansatz.

    Versuchs mal mit einem "richtigen" Datumsfeld (Typ DATE oder DATETIME), nicht mit einem Textfeld (Typ VARCHAR o.ä.). Dann kannst Du direkt auf größer, kleiner oder between vergleichen, sogar mit automatischer Berücksichtigung der Uhrzeit:

    SELECT * FROM Termine WHERE Termin BETWEEN #2002/03/11 12:00:00# AND #2002/03/11 18:30:59#

    (Beispiel: MS-Access-DB über ODBC)

    Bei der Ausgabe des Datensatzes kannst Du das Datum/Zeit ja mit deiner Server- oder Clientseitigen Scriptsprache so formattieren, wie Du es brauchst, bei der Eingabe von Daten baust Du Dir das Datum im oben beschriebenen Format zusammen.

    CU Christoph

    1. hallo Christoph,
      funktioniert das so auch bei mysql?
      danke und grüße
      stefan

      SELECT * FROM Termine WHERE Termin BETWEEN #2002/03/11 12:00:00# AND #2002/03/11 18:30:59#

      (Beispiel: MS-Access-DB über ODBC)

      Bei der Ausgabe des Datensatzes kannst Du das Datum/Zeit ja mit deiner Server- oder Clientseitigen Scriptsprache so formattieren, wie Du es brauchst, bei der Eingabe von Daten baust Du Dir das Datum im oben beschriebenen Format zusammen.

      CU Christoph

      1. Hallo Stefan,

        funktioniert das so auch bei mysql?

        Ja, da ist nur die Syntax etwas anders...

        Tabelle erstellen:

        CREATE TABLE Termine (Termin DATETIME, Name VARCHAR(30)...);

        Datensatz in Tabelle einfügen

        INSERT INTO Termine (Termin, Name,...) VALUES ('2002/03/11 11:15:00','Christoph'...);

        Abfragen

        SELECT * FROM Termine WHERE Termin BETWEEN '2002/03/11 08:00:00' AND '2002/03/11 20:00:00';

        Doku gibts hier: http://www.mysql.com/doc/D/A/DATETIME.html

        CU Christoph

  2. Hallo Stefan,

    so wie Christoph Dir riet, würde ich ein den Typ "Datum" für die Speicherung des Datums verwenden. Für Deine monatsbezogene Abfrage kannst Du mit der Funktion "MONTH()" arbeiten, z.B.:

    SELECT * FROM Termine WHERE MONTH(Termin) = 12

    HTH Robert