Come eseguire un'entità intervallo di dateQuery con un campo Solo data in Drupal 8?


8

In Drupal 8, il campo Solo data archivia i dati in una colonna varchar in un formato CCYY-MM-DD , ad esempio, 18-04-2016 .

Di conseguenza, non è più possibile eseguire semplicemente un'entitàQuery maggiore di ( > = ), minore di ( <= ) o simile.

C'è una soluzione semplice su come gestirlo? In particolare, sto tentando di eseguire due query, una in cui il campo data ha tra 14 e 21 giorni e uno in cui il campo data ha 21 e più giorni.


Non >=funziona? 20160318> = 20160218
kiamlaluno

I dati sono archiviati come XXXX-XX-XX(18-04-2016), quindi tecnicamente non è un numero, quindi fare una condizione numerica contro di esso non sarebbe valido.
Decifrare il

1
'2016-04-18' > '2016-03-18'funziona per me e '2014-04-18' > '2018-02-01'ritorna FALSE. Sì, è un confronto di stringhe, ma dato il formato della stringa, dovrebbe funzionare. Dopo tutto '1' < '2',.
kiamlaluno

1
Il problema potrebbe essere con '0001' < '2', forse.
kiamlaluno

Risposte:


16

Sto facendo un sacco di condizioni simili nelle query di entità, non ho ancora riscontrato un problema.

La cosa principale di cui devi essere consapevole è il fuso orario in cui sono memorizzati i dati, che è UTC. Devi convertirlo nel fuso orario di archiviazione (c'è una costante per quello), o la tua query sarà disattivata di alcune ore.

Ecco un esempio basato su qualcosa che sto facendo, se memorizzi solo giorni, allora c'è anche una costante per la formattazione.

$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();

Questo ha funzionato benissimo per un campo con data e ora: nel database lo spazio di archiviazione era simile 2016-07-18T13:00:00, ma Drupal ha gestito correttamente la conversione e il confronto utilizzando questa configurazione.
geerlingguy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.