whereYear mit Zeitzone

  • Guten Morgen allerseits,


    ich habe ein kleines Problem mit der "whereYear"-Query.


    Im Backend (in meinem eigenen Plugin) wird das Datum mit der Zeitzone "Europa/Berlin" eingegeben und als UTC in der Datenbank gespeichert. Dies ist ja soweit in Ordnung. Als Beispiel gebe ich z.B. die folgenden Daten ein:


    Eingabe "02.03.2020 10:00:00" -> gespeichert als "2020-03-02 09:00:00 UTC".


    Eingabe "01.01.2020 00:00:00" -> gespeichert als "2019-12-31 23:00:00 UTC".


    Man sieht das Problem bereits. Wenn ich jetzt "whereYear" mit 2020 aufrufe, bekomme ich nur den ersten Datensatz, nicht beide.


    Gibt es eine elegante Lösung für das Problem?


    Danke euch!

    Joachim

  • Hallo Joachim,

    da hast du zwei Möglichkeiten.


    1.) Die Spalte vom Datenbanksystem erst in die richtige Zeitzone bringen. Für MySQL wäre das so möglich:

    Code
    1. $query->whereYear(DB::raw("CONVERT_TZ(date,'UTC','MET')"), 2020);

    Aber Achtung: Der Spaltenname ist nicht vor SQL Injection geschützt. Wenn du MET durch eine Variable ersetzt, dann bitte darauf achten, dass nur gültige Werte gegeben werden können.


    2.) Manuell den Zeitraum abfragen, dazu Start und Enddatum in UTC mit Carbon generieren.

    Code
    1. $start= Carbon::create(2020, 1, 1, 0, 0, 0, 'Europe/Berlin')->setTimezone('UTC');
    2. $end= Carbon::create(2020, 12, 31, 23, 59, 59, 'Europe/Berlin')->setTimezone('UTC');
    3. $query->whereBetween('date', [$start, $end]);

    Ich bin mir momentan nur nicht sicher, ob whereBetween inklusive oder exkluse der Start- und Endwerte ist (sprich, ob die erste und letzte Sekunde enthalten ist oder nur die Zeit dazwischen). Das müsstest du einmal prüfen.

    Ich hoffe das hilft dir weiter.