[Frage] DateTime nur Date ohne Time [Gelöst]

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    16. 02. 2015, 15:28

    Hallo Leidensgenossen!

    meine Aufgabe: Personendaten(PD) und Verwandtschaftsverhältnisse ablegen, um Stammbäume darzustellen.
    Zu den PD kommen außer einfachen Strings für Namen noch Geburts- und Todesdatum.

    Problem: DateTime geht nur vom 31.12.1901 bis 19.1.2038 - für die Genealogie brauch ich aber auch einige Jahrhunderte davor.
    Über die Hälfte der 32 Bit gehen für einen einzigen Tag drauf (2^16 < 86400 Sekunden).

    Frage: Gibt es den Datentyp Date und (wie) wird das in extbase/php/mysql/typo3 unterstützt?

    Alternative Frage: Wer hat/hatte ähnliche Probleme und kann mir weiterhelfen?

    Danke im Voraus
    Gruß Harald

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    16. 03. 2015, 18:46 - Lösung

    Inzwischen hab ich die Lösung anderweitig raus.
    Aber ich will ja mal nicht so sein und schreib hier meine Erkenntnis hin.
    DateTime im Model ist schon gut. Der ExtensionBuilder erzeugt aber nur int(11) für die DB-Tabellenspalte. Das funktioniert auch, allerdings nur als 32Bit-timestamp.

    Um ein "sauberes" Datum zu bekommen, heißt es anpassen:

    ext_tables.sql

    1. birthday DATE DEFAULT '0000-00-00' NOT NULL,

    und entsprechend im TCA

    1. 'birthday' => array(
    2. ...
    3. 'config' => array(
    4. 'dbType' => 'date',
    5. 'type' => 'input',
    6. 'eval' => 'date',
    7. ...
    8. ),
    9. ),

    Der Knackpunkt bei mir war 'dbType'.
    Ich will nur das Datum, benutze im Model trotzdem DateTime.
    Wer auch DateTime in der Datenbank haben will, muss das in SQL und TCA entsprechend anpassen.


  • 1
  • toifel toifel
    Jedi-Ratsmitglied
    0 x
    831 Beiträge
    96 Hilfreiche Beiträge
    16. 02. 2015, 16:09

    DateTime wurde eigentlich genau dafür gemacht, dass man nicht nur den timestamp-Bereich hat.
    http://de2.php.net/manual/de/intro.datetime.php - "Der darstellbare Bereich liegt zwischen etwa bei 292 Milliarden Jahren in die Vergangenheit und genauso viel in die Zukunft."
    Sollte für die meisten Stammbäume ausreichend sein.

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    16. 02. 2015, 19:49

    Theoretisch gut und schön. So steht das auf der Seite, die du mir verlinkt hast.
    Dummerweise verwende ich diesen DateTime-Typ, bekomm aber keine Daten vor besagtem Stichtag hin.
    Ich würde nicht fragen, wenn es klappen würde.
    Wenn ich (z.B. in meiner newAction) ein älteres Datum eingebe, wird -2147483648 (das Minimum von signed 32 Bit) abgespeichert, was ich in der Ausgabe als 13.12.1901 zu sehen bekomme. Jedes davor liegende Datum wird mit genau dem selben Wert abgespeichert.

    Wo liegt das Problem?
    Ich hab offensichtlich keine 64 sondern nur 32 Bit zur Verfügung.

    WARUM?

    Ich hab mit dem ExtensionBuilder gekickstartet und dort gesagt, daß ich den Typ Date möchte.
    In meinem Model steht DateTime. In der DB habe ich INT(11).

    Hab ich etwas übersehen?

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    19. 02. 2015, 10:05

    Hallo, da bin ich wieder,

    wie toifel schon gesagt hat, [i]DateTime wurde eigentlich genau dafür gemacht[/i], dachte ich auch... eigentlich ... aber wie jetzt eigentlich? Echt? Wirklich? Oder doch nur eigentlich?

    Ich kann mit Sicherheit sagen, daß der kleinste Wert, den meine Mysql-DB abspeichert, -2147483648 ist. Das sind aber keine 64 Bit, sondern nur 32 Bit. Das entspricht auch dem Datums-Minimum vom 13.12.1901.

    Davon ausgehend, daß die PHP-seitige Verwendung von DateTime richtig ist, hab ich andere Typen in der DB ausprobiert. Aber weder Date noch Datetime funktionieren in dieser Kombination:
    Erzeuge ich ein Element mittels new/create-Formular, erhalte ich ein NULL-Datum (0000-00-00), editiere ich das Datum z.B. im phpmyadmin, steht das dort zwar wie eingegeben, erhalte aber im FE ein 0-Datum (1.1.1970). Also hab ich wieder auf INT(11) zurückgespult und bin auf dem Stand von zuvor.
    Ich hab auch mal INT(22) ausprobiert... verhält sich genauso wie INT(11) :(

    Eigentlich... ich sag mal: Trivial ist anders.
    Ich hab noch weitere Infos:
    TYPO3 6.1.1
    PHP 5.3.8
    mysql Server Version: 5.5.16

    Im Übrigen würden mir 32 Bit schon reichen, wenn nicht über die Hälfte davon für die Sekunden eines einzigen Tages drauf gingen.

    Gruß
    Harald

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    28. 02. 2015, 12:01

    Das kann's doch nicht sein!
    Ich bin jetzt echt ratlos.

    Ich hab hier ein Problem mit DateTime. Angeblich sollen damit Millionen von Jahren abbildbar sein. In der Praxis sieht es (zumindest bei mir) aber anders aus.
    Mit dem ExtensionBuilder gestartet, hab ich in meinem Model DateTime und in der Datenbank steht INT(11).
    Diese beiden vertragen sich aber nicht 100%ig. Denn der Wertebereich geht nur von 1901 bis 2038.

    Hat irgendjemand hier schon Erfahrungen mit Daten außerhalb des Zeitraums 1901-2038 gemacht?
    Wenn ja... BITTE! teilt die Erfahrung mit mir!

    Warum funktioniert das bei mir nicht?
    Was mach ich falsch?
    Wie mach ich's richtig?

    Gruß
    Harald

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    16. 03. 2015, 18:46

    Inzwischen hab ich die Lösung anderweitig raus.
    Aber ich will ja mal nicht so sein und schreib hier meine Erkenntnis hin.
    DateTime im Model ist schon gut. Der ExtensionBuilder erzeugt aber nur int(11) für die DB-Tabellenspalte. Das funktioniert auch, allerdings nur als 32Bit-timestamp.

    Um ein "sauberes" Datum zu bekommen, heißt es anpassen:

    ext_tables.sql

    1. birthday DATE DEFAULT '0000-00-00' NOT NULL,

    und entsprechend im TCA

    1. 'birthday' => array(
    2. ...
    3. 'config' => array(
    4. 'dbType' => 'date',
    5. 'type' => 'input',
    6. 'eval' => 'date',
    7. ...
    8. ),
    9. ),

    Der Knackpunkt bei mir war 'dbType'.
    Ich will nur das Datum, benutze im Model trotzdem DateTime.
    Wer auch DateTime in der Datenbank haben will, muss das in SQL und TCA entsprechend anpassen.

  • 1