Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Tabellenfeld DATE Problem (BC, nur Jahreszahl..) (https://www.delphipraxis.net/207572-tabellenfeld-date-problem-bc-nur-jahreszahl.html)

NoGAD 10. Apr 2021 02:55

Datenbank: ABS_Database • Version: 7.92 • Zugriff über: ABSTable/ABSQuery

Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Hallo,

ich habe wieder einmal eine Frage. Wenn ich eine Tabelle anlege, möchte ich auch (wurde mir angeraten) Datum in einem DATE-Field speichern.

Nun ist es aber so, dass nicht jeder Autor (in meinem Fall) auch einem direkten Datum zugeordnet werden kann. Es gibt also teilweise nur Jahreszahlen. Dann meckert aber die Datenbank herum.

Was anderes ist z.B., wenn eine Datum VOR dem Jahre Null eingegeben werden möchte.


Wie geht man mit diesen beiden Problemen denn bitte um?


LG Mathias

Delphi.Narium 10. Apr 2021 09:54

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Ganz einfach: Wenn es kein Datum gibt, kann man es nicht als Datum speichern.

Alternative ist also dann doch wieder der String. Ist es ein vollständiges Datum dann ist das so, ist es nur eine Jahreszahl, dann ist das auch so.

Schwierig wird es, wenn man dann auch noch danach sortieren will. Dann wird es eher strubbelig.

Man könnte also hergehen und das Datum einfach so, wie es ist, als String speichern und zusätzlich noch ein "künstliches" Datum generieren, was man ebenfalls (in einem zweiten Feld vom Typ Integer) speichert, dabei erhalten die Autoren vor dem Jahr Null einen negativen Wert.

Dort baut man sich dann ein passendes Datum zusammen, z. B. sowas:
AutorDatumSortierdatumVorChristi
Ernst Jünger29.03.1895189503290
Pythagoras570-057000001
Jacob Abbott1803180300000

Sortieren könnte man dann in der Art:
SQL-Code:
select Autor, Datum from tabelle order by Sortierdatum, Autor
Damit hätte man dann alle Autoren aufsteigend nach Datum vom "Anbeginn der Zeit" bis in die "unabsehbare Zukunft" sortiert. Die Autoren, die über kein vollständiges Datum verfügen, befinden sich dabei immer am Anfang der Autoren eines Jahres. Möchte man diese an das Jahresende "verbannen" dann muss man halt die vier Nullen, die momentan den Jahresanfang "symbolisieren", durch z. B. vier Neunen ersetzen. Damit sind sie immer die "Letzten" im entsprechenden Jahr. Vor dem Jahr Null verhält es sich genau umgekehrt.

NoGAD 10. Apr 2021 10:15

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Das klingt phantastisch. Diese Idee gefällt mir gut, ich werde das so übernehmen :-)

Lieben Dank und ein schönes Wochenende!

Mathias

Billa 10. Apr 2021 11:27

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Und wenn Du dann diesen Unterschied auch noch eliminieren willst, "verschiebst" Du den Integerwert des künstlichen Datums noch um X Jahre nach "hinten". Umrechnen musst Du eventuell für die Darstellung sowieso, sparst Dir aber eine unterschiedliche Behandlung (und das Tabellenfeld) von "vor und nach Christus".
Für den Offset X reichen vermutlich ungefähr 1000 aus. Für schriftliche Quellen sind mir keine älteren Daten bekannt. (Archäologen mögen mich korrigieren)

Delphi.Narium 10. Apr 2021 12:01

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Zitat:

Zitat von Billa (Beitrag 1486839)
Und wenn Du dann diesen Unterschied auch noch eliminieren willst, "verschiebst" Du den Integerwert des künstlichen Datums noch um X Jahre nach "hinten". Umrechnen musst Du eventuell für die Darstellung sowieso, sparst Dir aber eine unterschiedliche Behandlung (und das Tabellenfeld) von "vor und nach Christus".
Für den Offset X reichen vermutlich ungefähr 1000 aus. Für schriftliche Quellen sind mir keine älteren Daten bekannt. (Archäologen mögen mich korrigieren)

Das Feld "vor und nach Christus" ist in meinem Beispiel nur zur Verdeutlichung, es wird nicht benötigt.
Die Darstellung kommt aus dem Feld Datum, da kann beliebige Prosa drinne stehe, eben auch ein Datum in gewohnter Formatierung. Das ist aber kein muss.

Beim ollen Pythagoras könnte da auch 570 BC oder 570 v. Chr. oder ca. 570 v. Chr. oder vermutlich um 570 v. Chr. drinne stehen, dass hat auf die Sortierung per Sortierdatum keinerlei Einfluss. Und bei Zahlen, die größer oder kleiner als Null sein können, finde ich es einfach naheliegend, mit positiven und negativen Zahlen zu arbeiten, da braucht mein keinen Offset oder irgendeine Umrechnung oder Vermutungen, welcher Offset nach momentanem Kenntnisstand ausreichend sein könnte ...
Vom Urknall bis, wer weiß, was die Zukunft bringen wird, kann man halt auf einer Zeitachse jedes Jahr, egal von welchem Planeten man das Jahr als Maßstab nimmt, von minus ∞ bis plus ∞ darstellen (allenfalls könnte Integer da ein bisserl zu klein für sein ;-)). Nix anderes passiert bei meinem Vorschlag.

haentschman 10. Apr 2021 14:51

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Moin...:P

UnixDatetime = ganzzahlig = jede Sekunde seit 01.01.1970
https://www.delphipraxis.net/26033-u...tdatetime.html
https://www.delphipraxis.net/196625-...zurueck-2.html

Für die Daten ohne Datum einen beliebigen Wert definieren (erste Sekunde oder letzte Sekunde oder Time <> 0 z.B.). Damit kann man in einer Funktion unterscheiden ob Datum oder Jahreswert...

fertsch...8-)

PS:

Delphi.Narium 10. Apr 2021 15:14

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
UnixDatetime hat den Nachteil, dass man damit keine Datumswerte von vor Christi Geburt abbilden kann. 1970 beginnt bereits für Christi Geburt ca. 1970 Jahre zu spät oder ca. 62.125.920.000 Sekunden (ohne Berücksichtigung von Schaltjahren und der Kalenderreformierung von 1542). Für das Geburtsdatum des Herrn Pythagoras wären das dann schon etwa 80.101.440.000 Sekunden, also grob pro Einwohner der Bundesrepublik eine Sekunde. Gut, eine Sekunde pro Einwohner klingt jetzt nicht unbedingt viel, aber für den lieben Pythagoras ist das doch schon 'ne ganze Menge ;-)

Das Problem in der Aufgabenstellung ist nun mal, dass man unvollständige Datumsangaben nicht als vollständige Datumsangaben abbilden kann, da ist es egal ob UnixDateTime ab dem 01.01.1970 in Sekunden oder TDateTime ab 30.12.1899 in Tagen nicht funktioniert.

Man braucht halt 'ne funktionierende Alternative ;-) Und die scheint mir mit beliebigen Datumstypen nicht realisierbar. Alle haben eins gemein: Sie können unvollständige Datumswerte nicht unvollständig abbilden. Man muss die unvollständigen Datumswerte immer zu vollständigen Datumswerten ergänzen, mit der Folge, dass die unvollständigen und die vollständigen Datumswerte nicht mehr übereinstimmen ;-)

NoGAD 10. Apr 2021 22:03

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Vielen Dank euch allen :-)

Ich schließe mich gedanklich an Delphi.Narium an.

NoGAD 11. Apr 2021 00:30

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1486828)
Alternative ist also dann doch wieder der String.


Huhu, eine kleine Rückfrage noch.

Meine Umwandlung eines Datums führt mich zu folgendem Code:

Delphi-Quellcode:
    Dummy_Date_Random := RandomDate; // Ergibt ein valides Datum als TDate
    DecodeDate(Dummy_Date_Random, Dummy_Year, Dummy_Month, Dummy_Day); // Umwandlung in Word
    Dummy_String := Dummy_Year.ToString + Dummy_Month.ToString + Dummy_Day.ToString; // String zusammensetzen
Ist das von mir zu umständlich gemacht, oder geht das nicht anders? :?

LG Mathias

Delphi.Narium 11. Apr 2021 08:57

AW: Tabellenfeld DATE Problem (BC, nur Jahreszahl..)
 
Viele Wege führen nach Rom, meiner sähe so aus:
Delphi-Quellcode:
Dummy_String := FormatDateTime('yyyymmdd', RandomDate);


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz