Wie erstelle ich eine Datumsbereich-EntityQuery mit einem Nur-Datum-Feld in Drupal 8?

8

In Drupal 8 speichert das Feld Nur Datum Daten in einer Varchar- Spalte in einem CCYY-MM-DD- Format, z . B. 2016-04-18 .

Daher können Sie nicht mehr einfach eine auf ( > = ), weniger als ( <= ) oder ähnlichen zeitstempelbasierten entityQuery basierende Entität ausführen.

Gibt es eine einfache Lösung, wie man damit umgeht? Insbesondere versuche ich, zwei Abfragen durchzuführen, eine, bei der das Datumsfeld zwischen 14 und 21 Tagen alt ist, und eine, bei der das Datumsfeld 21 und mehr Tage alt ist.

Entziffern
quelle
Nicht >=funktioniert? 20160318> = 20160218
kiamlaluno
Die Daten werden als XXXX-XX-XX(2016-04-18) gespeichert , daher handelt es sich technisch gesehen nicht um eine Zahl, weshalb eine numerische Bedingung dagegen nicht gültig wäre.
Entschlüsseln Sie den
1
'2016-04-18' > '2016-03-18'arbeitet für mich und '2014-04-18' > '2018-02-01'kehrt zurück FALSE. Ja, es ist ein Zeichenfolgenvergleich, aber angesichts des Zeichenfolgenformats sollte es funktionieren. Immerhin '1' < '2'.
Kiamlaluno
1
Das Problem wäre '0001' < '2'vielleicht mit.
Kiamlaluno

Antworten:

16

Ich mache viele solche Bedingungen in Entitätsabfragen, ich habe noch kein Problem festgestellt.

Die Hauptsache, die Sie beachten müssen, ist die Zeitzone, in der die Daten gespeichert werden (UTC). Sie müssen es in die Speicherzeitzone konvertieren (dafür gibt es eine Konstante), sonst ist Ihre Abfrage um einige Stunden deaktiviert.

Hier ist ein Beispiel, das auf etwas basiert, das ich mache. Wenn Sie nur Tage speichern, gibt es auch eine Konstante für die Formatierung.

$date = new DrupalDateTime('21 days ago');
$date->setTimezone(new \DateTimezone(DATETIME_STORAGE_TIMEZONE));
$formatted = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);

$nids = \Drupal::entityQuery('node')
  ->condition('your_date_field.value', $formatted, '<=')
  ->range(0, 50)
  ->execute();
Berdir
quelle
Dies funktionierte hervorragend für ein Feld mit Zeitstempel - in der Datenbank war der Speicher wie 2016-07-18T13:00:00, aber Drupal hat die Konvertierung und den Vergleich mit diesem Setup ordnungsgemäß durchgeführt.
Geerlingguy