[Frage] Probleme mit Queries und DateTime

  • buzz-dee buzz-dee
    Padawan
    0 x
    46 Beiträge
    1 Hilfreiche Beiträge
    21. 10. 2014, 10:54

    Hallo zusammen,

    ich habe in einem Repositority Objekte, die ein datetime-Feld "datum" enthalten. Nun möchte ich eine Funktion im Repositority schreiben, die mir alle Objekte zurückliefert, die einem übergebenen Jahr zugeodnet sind. Meine derzeitige Funktion sieht so aus:

    1. /**
    2. * @param int $year
    3. */
    4. public function getItemsByYear($year = 0) {
    5.  
    6. if ($year == 0) {
    7. return $this->findAll();
    8. }
    9.  
    10. // Use datetime Objects
    11. $date_min = new \datetime("$year-01-01 00:00:01");
    12. $date_max = new \datetime("$year-12-31 23:59:59");
    13. echo $date_min->format("d.m.Y - H:i") ." bis ". $date_max->format("d.m.Y - H:i");
    14.  
    15. // Use UNIX time stamps
    16. $date_min = mktime(0,0,1,1,1,$year);
    17. $date_max = mktime(23,59,59,12,31,$year);
    18. echo date("d.m.Y - H:i", $date_min). " bis ".date("d.m.Y - H:i", $date_max);
    19.  
    20. $query = $this->createquery();
    21. $query->matching(
    22. $query->logicalAnd(
    23. $query->greaterThanOrEqual('datum', $date_min),
    24. $query->lessThanOrEqual('datum', $date_max)
    25. )
    26. );
    27.  
    28. return $query->execute();
    29. }

    Leider bekomme ich kein Ergebnis zurück. Habe sowohl UNIX Timestamps als auch DateTime-Objekten versucht. Leider erfolglos. Hat jemand eine Idee, wo der Fehler liegt?

    PS: Die Ausgabe der "echos" sehen gut aus.

    Tags: Extbase

  • 1
  • OnkelEdi OnkelEdi
    Jedi-Ritter
    0 x
    129 Beiträge
    2 Hilfreiche Beiträge
    21. 10. 2014, 13:45

    Hi,

    Ich mach das mit den Querries nicht besonders oft, aber ich werde jetzt einmal kund tun was mir aufgefallen ist.
    Also auf den ersten Blick denke ich, ist dein $year immer 0. Du setzt es oben in der Funktionsklammer ja auf 0 und dann wird es nicht mehr geändert. Auch wenn du etwas der Funktion mitgibts wird es davon überschrieben oder nicht? Folglich gäbs dann kein Ergebnis... solange es keinen Datensatzgibt bei dem das Jahr 0 ist. Wenn das stimmt würde ich sagen du setzt $year vor der Funktion getItemsByYear() auf null.
    Ansonsten einfach garnicht auf 0 setzten und einfach mit "isset($year)" statt "$year == 0" testen ob da überhaupt was drin ist. Dann könnte man sich das mit der 0 sparen.

    was passiert den wenn du einen Wert fest einträgst, also einen von dem du weißt dass es ihn gibt?
    Funktioniert dann der Teil in der if-Klammer das heißt, funktioniert überhaupt was?

    Mehr fällt mir dazu jetzt auch nicht ein. Vielleicht hilfts ja.
    Gruß
    Eduard

  • buzz-dee buzz-dee
    Padawan
    0 x
    46 Beiträge
    1 Hilfreiche Beiträge
    21. 10. 2014, 14:46

    Hallo Eduard,

    danke für Deine Antwort. Die 0 ist ein default parameter, d.h. Wenn kein Wert an die Funktion übergeben wird, wird die 0 verwendet. Dann prüfe ich auf 0 und gebe ggf. (Übergebener Wert ist 0 oder nicht gesetzt) alle Datensätze zurück. Und wie gesagt, die echo-Ausgaben zeigen genau die richtige Zeitspanne an.
    Habe das ganze auch schon mit festen Werten versucht, bei denen ich sicher bin, dass es dazu Datensätze gibt. Leider bekomme ich auch dann ein leeres Resultset zurück :-(

  • OnkelEdi OnkelEdi
    Jedi-Ritter
    0 x
    129 Beiträge
    2 Hilfreiche Beiträge
    21. 10. 2014, 15:09

    ok...
    vielleicht weil du z. B. hier:

    $query->greaterThanOrEqual('datum', $date_min),

    zwei Werte vergleichst die nicht vom typ Integer sind... kann das sein?
    Das sind doch beides Werte im Datumsformat oder nicht? Korrigier mich wenns falsch ist,
    aber das kann doch nicht einfach verglichen werden oder?

  • buzz-dee buzz-dee
    Padawan
    0 x
    46 Beiträge
    1 Hilfreiche Beiträge
    21. 10. 2014, 15:25

    Hey OnkelEdi,

    ich hatte nur in dem Beispiel beide Varianten drin gelassen. Die obere Variante (// Use datetime Objects) arbeitet mit Objekten. Ob man die so vergleichen kann weiß ich nicht. Aber irgendwie muss es doch gehen, oder? Ist doch m.E. kein exotisches Problem...


  • 0 x
    21. 10. 2014, 16:50

    Wenn du in der Datenbank UNIX Timestamps hast, musst du auch mit UNIX Timestamps vergleichen. Ein formatiertes Datum kannst du, soweit ich weiß, nicht mit einem UNIX Timestamp vergleichen. In welcher Form sind denn deine Daten gespeichert ?

    Hatte aber auch letztens erst arge Probleme damit, formatierte DateTimes zu vergleichen, und bin dann auf UNIX Timestamp umgestiegen..

  • jenses jenses
    Flash Gordon
    0 x
    3087 Beiträge
    106 Hilfreiche Beiträge
    22. 10. 2014, 08:00

    Im Prinzip funktioniert der Vergleich von datetime-Objekten,
    du mußt aber natürlich darauf achten, daß du auch durchgängig damit arbeitest,
    auch z.B. in den Annotationen im Model usw.

    1. /**
    2. * datum
    3. *
    4. * @var \DateTime
    5. * @validate NotEmpty
    6. */
    7. protected $datum;

    Mit dem echo zum Debuggen wirst du auch nicht weit kommen,
    versuche es mal hiermit:

    1. \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($query, '$query', 12);

  • buzz-dee buzz-dee
    Padawan
    0 x
    46 Beiträge
    1 Hilfreiche Beiträge
    22. 10. 2014, 10:58

    Hi zusammen,

    habe es jetzt hinbekommen. Dass es so einfach ist, hätte ich nicht gedacht. Hier die funktionierende Methode:

    1. public function getItemsByYear($year = 0) {
    2.  
    3. if ($year == 0) {
    4. return $this->findAll();
    5. }
    6.  
    7. $date_min = $year."-01-01";
    8. $date_max = $year."-12-31";
    9.  
    10. $query = $this->createQuery();
    11.  
    12. $query->matching(
    13. $query->logicalAnd(
    14. $query->greaterThanOrEqual('datum', $date_min),
    15. $query->lessThanOrEqual('datum', $date_max)
    16. )
    17. );
    18.  
    19. return $query->execute();
    20. }

    Werde wohl in Zukunft auch Timestamps verwenden. Hatte beim Extension Builder wohl nicht richtig genug hingeschaut bei der Typauswahl ;-)

  • 1