SQL Tabelle mit Spalte fürs Datum


#1

Hallo,

ich bin momentan am programmieren eines kleinen Programms. Für dieses ist eine SQL Datenbank erforderlich.
Neben vielen weiteren Spalten muss es auch eine geben in der Angaben zum Datum gespeichert werden können wie z.B.: Geburtstage.
Doch ich habe einige Fragen dazu.
Meine Tabelle wird so erstellt:
[SQL]CREATE TABLE IF NOT EXISTS Einlagerung([…],Datum Date,[…])[/SQL]

Nun welchen Vorteil habe ich gegenüber String (bzw VARCHAR) das Datum so in die Datenbank zu speichern?
Die Frage mag blöd erscheinen. Doch ich nutze die Datumsangabe nur zum Anzeigen auf der GUI und nicht weiter um damit z.B. zu rechnen.

Wie genau speichere ich überhaupt ein Datum in eine Datenbank?
Wenn ich es richtig verstanden habe so muss das Datum so aussehen: 20131003 (Ursprünglich: 10.03.2013)

Nun zur 3. und letzten Frage:
Über eine Textbox auf de GUI gibt der User ein Datum ein (10.03.2013). Wie bekomme ich diesen String umgewandelt in eine Datumsangabe die SQL versteht? Der User kann natürlich Fehler bei der Eingabe machen wie 1.3.13 oder ähnliches. Das muss natürlich verhindert werden. Auch später beim laden der Datumsangaben müssen diese ja wieder im richtigen Format stehen (DD.MM.YYYY). Wie bekomme ich das hin?

Es würde mich sehr freuen wenn mir einer weiter helfen kann.

Mit freundlichen Grüßen
teebaron


#2

Datum wird, laienhaft gesagt, intern getrennt nach Jahr, Monat und Tag gespeichert. Abhängig von deinen Wünschen wird das Datum dann angezeigt (DB und Java), abhängig von der Ausgabeformatierung (locale etc). Wenn du also deine DB auf deutsch eingestellt hast und “22.08.2013” speicherts und die DB dann nem Ami gibst, ders natürlich mit us locale aufruft, dann kriegt er trotzdem brav die richtigen Ausgabe: 08.22.2013 raus.

Wenn du einen String oder int speicherst, dann muss die Gegenstelle immer wissen, in welcher Reihenfolge du alles notiert hast… während es bei 20133110 zwar durchaus noch zu erkennen ist, könnte es bei 20131012 schon “problematischer” werden.

Wie du das Datum der DB übergibst hängt von der DB ab. In PSQL übergibst das Datum wie eine Zeichenkette. Also in die Spalte mit dem Datentyp “date” gibst ein ‘31.10.2013’

Umgewandelst kriegst es mit DateFormat etc.


#3

Nun welchen Vorteil habe ich gegenüber String (bzw VARCHAR) das Datum so in die Datenbank zu speichern?
Die Frage mag blöd erscheinen. Doch ich nutze die Datumsangabe nur zum Anzeigen auf der GUI und nicht weiter um damit z.B. zu rechnen.

Zunächst mal Typsicherheit und die Möglichkeit, damit später doch mal Berechnungen oder Vergleiche durchzuführen und wenn es auch nur ein ORDER BY ist.

Wie genau speichere ich überhaupt ein Datum in eine Datenbank?
Wenn ich es richtig verstanden habe so muss das Datum so aussehen: 20131003 (Ursprünglich: 10.03.2013)

Ist ein wenig vom DBMS und da evtl. noch vom verwendeten Datumsformat abhängig. Mit den Infos bitte Google-Suche.

Über eine Textbox auf de GUI gibt der User ein Datum ein (10.03.2013). Wie bekomme ich diesen String umgewandelt in eine Datumsangabe die SQL versteht? Der User kann natürlich Fehler bei der Eingabe machen wie 1.3.13 oder ähnliches. Das muss natürlich verhindert werden. Auch später beim laden der Datumsangaben müssen diese ja wieder im richtigen Format stehen (DD.MM.YYYY). Wie bekomme ich das hin?

Nutze ein DateFormat (bspw. SimpleDateFormat), um Strings in Java-Dates zu wandeln. Wenn Du JFormattedTextBox benutzt, werden auch Fehleingaben gleich verhindert. Ansonsten entweder vorher mit Regex prüfen oder den String einfach vom DateFormat parsen lassen und die Exceptions bei Parsingfehlern adäquat behandeln.


#4

Auch wenn du momentan keine Datumsfunktionen solltest du nicht ausschließen das sich das nicht doch irgendwann mal ändert. Du hast dazu auch noch mit DATE den Vorteil einfach Datumsbereiche abfragen zu können. (z.b. Datum BETWEEN '20130101' AND '20130131' für alle Datensätze vom Januar) Außerdem braucht der Datentyp DATE weniger Speicherplatz als ein VARCHAR.

Du müßtest das Datum vorher parsen. In Java würde ich dafür SimpleDateFormat#parse() verwenden. Mit der Klasse kannst du auch die Formatierung für die GUI machen.


#5

Ein String ist ja nur eine Darstellungsvariante eines Datums und muss immer interpretiert werden, verschiedene Nationaltiäten stellen ein Datum anders dar. Verschiedene Kulturen verwenden verschiedene Kalender/Zeitrechnungen. Ein Date ist konkret spezifiziert und eindeutig. Ein String kann ein ungültiges Datum darstellen… Im einfachsten Fall willst Du die Datensätze sortiert nach Datum darstellen oder willst nur Datensätze eines bestimmten Zeitraums darstellen.

[QUOTE=teebaron;29229]Wie genau speichere ich überhaupt ein Datum in eine Datenbank?
Wenn ich es richtig verstanden habe so muss das Datum so aussehen: 20131003 (Ursprünglich: 10.03.2013)[/QUOTE]
Die Frage verstehe ich nicht? In dem Du das Datum/Date in die Datenbank speicherst. Ein Datum hat kein konkretes “Aussehen” siehe oben.

[QUOTE=teebaron;29229]Nun zur 3. und letzten Frage:
Über eine Textbox auf de GUI gibt der User ein Datum ein (10.03.2013). Wie bekomme ich diesen String umgewandelt in eine Datumsangabe die SQL versteht? Der User kann natürlich Fehler bei der Eingabe machen wie 1.3.13 oder ähnliches. Das muss natürlich verhindert werden. Auch später beim laden der Datumsangaben müssen diese ja wieder im richtigen Format stehen (DD.MM.YYYY). Wie bekomme ich das hin?[/QUOTE]
Die Klasse SimpleDateFormat bietet diese Funktionaliäten.

Was ist an der Darstellung des Datums falsch?


#6

Okay vielen Dank für eure Hilfe es hat jetzt klick gemacht :slight_smile:
Es macht also auch hier Sinn diesenTypen zu nutzen.
Ich werde dann mal ein wenig testen :slight_smile:
Vielen Dank

Teebaron