Typ date ohne Jahrhundert und Jahrtausend

Kira-Bianca

Neuer Benutzer
Beiträge
2
Hallo Leutz,

bei dem Aufbau einer Datenbank möchte ich ein Feld im Format DATE verwenden, bei dem die Jahreszahl aber eine besondere Funktion hat und Werte kleiner 1000 enthält. Das Problem ist, dass MySQL eine Zuweisung für dieses Feld automatisch um Jahrtausende erhöht, und das nicht einmal immer und mit unterschiedlichen Jahrhunderten.
Bei den Jahreszahlen 0 bis 9 wird dem Feld der korrekte Wert zugewiesen ('000y'). bei den Jahreszahlen 10 bis 69 wird daraus das 20. Jahrhundert ('20yy') und bei Jahren von 70 bis 99 wird es das 19. Jahrhundert ('19yy'). Ab Jahr 100 ist es wieder korrekt ('0yyy'). Dabei ist es egal, ob ich die Jahreszahl bei der Wertzuweisung mit führenden Nullen (z. B. '0015-mm-dd') oder ohne führende Nullen ('15-mm-dd') angebe.

Mit den Daten in dieser Form kann ich nichts anfangen und eine programmtechnische Ermittlung der "richtigen" Jahreszahl bei der Feldabfrage (PHP: Jahr ist Jahr oder Jahr modulo 100 oder Jahr modulo 1000 :D) kann ja auch nicht der Sinn sein. Gibt es eine Möglichkeit, mySQL den Blödsinn auszutreiben, die Jahreszahlen zu verfälschen? Wenn möglich möchte ich das Feldformat DATE für beide Angaben zusammen beibehalten. Eine Trennung der beiden Daten in zwei Feldern ('Jahr':SMALLINT(3) UNSIGNED und 'Datum':DATE, bei dem nur 'mm-dd' relevant wäre) oder ein Datentyp CHAR(10) wäre zwar denkbar, aber aufgrund eines sehr häufiges Vorkommens dieser Zusammenstellung innerhalb der Datenbank nicht optimal. Bei Trennung auf 2 Felder würde die Strukturen der Tabellen um einiges unübersichtlicher werden als sie jetzt schon (zwangsläufig) sind (Fremdschlüssel zwischen den Tabellen auf 2 Felder beziehen; Feldnamen mit 'JahrDatum1', 'Datum1', 'JahrDatum2', 'Datum2', 'andereDaten', 'JahrDatum3', 'Datum3' ...:confused:). Außerdem müsste jede Abfrage mit CONCAT() erweitert werden, weil die Daten generell in einem Zusammenhang stehen und auch entsprechend genutzt werden. Und bei CHAR(10) müsste jede Eingabe auf Zulässigkeit (DATE-Format) geprüft werden.

Ich bedanke mich schon im Voraus für Eure Vorschläge und vielleicht sogar einer Lösung des Problems.

VieleGrüße
Kira-Bianca
 
Werbung:

Dukel

Datenbank-Guru
Beiträge
532
Ist wohl by design so.

MySQL :: MySQL 8.0 Reference Manual :: 11.2.2 The DATE, DATETIME, and TIMESTAMP Types
The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.

The DATETIME type is used for values that contain both date and time parts. MySQL retrieves and displays DATETIME values in 'YYYY-MM-DD hh:mm:ss' format. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.

The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
 

Kira-Bianca

Neuer Benutzer
Beiträge
2
Hallo akretschmer,

natürlich soll in dem Datum etwas anderes hinterlegt werden als eine Jahreszahl. Eine "normale" Jahreszahl hat ja keine wie von mir erwähnte (und vor Dir zitierte;)) besondere Funktion. Jedoch stehen diese Jahreszahl mit besonderer Funktion, Monat und Tag in einem direkten Zusammenhang und die Jahresangabe ist immer INT UNSIGNED und kleiner 1000 (genauer: immer kleiner 512).

Y2Y ist mir selbstverständlich auch ein Begriff (so jung bin ich leider doch nicht mehr) unnd ich habe da natürlich auch schon Herrn google.de gefragt, wie dieses Problem in meiner Angelegenheit gehandelt werden kann. Da habe ich trotz intensiver Suche und einem eigentlich sehr guten Verhältnis zu Herrn google aber nichts gefunden. Und genau betrachtet liegt das Problem nicht nur bei Y2Y, denn die Jahreszahlen werden ja nur bei den 0010 bis 0099 verfälscht. Y2Y war aber, wenn ich mich recht erinnere, im Jahr 2000 ;) Daraus kann also nur der auch nachvollziehbare Unterschied der Verfälschungen +1900 oder +2000 liegen. Aber warum wird bei Jahresangaben weit vor (dem letzten) Y2Y überhaupt verfälscht und dann auch nur im den Bereich 10 - 99? Warum wird aus z. B. anno 682 kein 2582 oder 2682 oder anno 2 kein 2002? Ist da vielleicht von den Fachleuten, die sich dem Y2Y-Problem angenommen und es gelöst haben, wieder kurzfristig gedacht worden und im Jahr 2100 haben wir dasselbe in Grün, nur nicht auf das Jahrtausend sondern auf das Jahrhundert bezogen? Aber selbst eine Antwort auf diese Frage würde mir ja nicht helfen. Ich brauche ja eine Lösung, die eine Verfälschung der Jahreszahlen immer ausschließt.

Was ich bei meinem ersten Beitrag oben vergessen habe ist zu erwähnen, dass es auch nicht möglich ist, zu der Jahresangabe generell manuell 2000 zu addieren. Damit wäre zwar eine Einheitlichkeit (das Jahr ist immer Jahr - 2000) erreicht. Aber es soll nur ein Teil einer alten Software ersetzen werden, zu der auch die teilweise Neustrukturierung der Datenbank gehört. Und die alte Software erwartet die Jahreangaben im Bereich 0 - 511.

Grüße
Kira-Bianca
 
Werbung:

dabadepdu

Datenbank-Guru
Beiträge
1.179
Also mal kompakt:
Du brauchst einen Date Typ, dessen Range von Jahr 0 an bis 512 oder auch weiter geht?
Ohne Tageszeit Anteil?

Du sprichst von "Aufbau" einer Datenbank. Könntest Du beim Aufbau gleich eine richtige Datenbank nehmen, die solche Typen bereitstellt?
Oder muss es auf Biegen und Brechen mySQL sein, also eine Bastelei sein?
 
Oben