¿Cómo hacer una consulta de entidad de rango de fechas con un campo de Fecha solamente en Drupal 8?

8

En Drupal 8, el campo Fecha solamente almacena datos en una columna varchar en formato CCYY -MM-DD , por ejemplo, 2016-04-18 .

Como tal, ya no puede simplemente hacer un mayor que ( > = ), menor que ( <= ) o una entidad de consulta basada en marca de tiempo similar.

¿Hay una solución simple sobre cómo lidiar con esto? Específicamente, estoy intentando hacer dos consultas, una donde el campo de fecha tiene entre 14 y 21 días de antigüedad, y una donde el campo de fecha tiene 21 años o más.

Descifrar
fuente
No >=funciona 20160318> = 20160218
kiamlaluno
Los datos se almacenan como XXXX-XX-XX(2016-04-18), por lo que técnicamente no es un número, por lo tanto, hacer una condición numérica no sería válido.
Descifrar
1
'2016-04-18' > '2016-03-18'funciona para mí y '2014-04-18' > '2018-02-01'vuelve FALSE. Sí, es una comparación de cadenas, pero dado el formato de cadena, debería funcionar. Después de todo, '1' < '2'.
kiamlaluno
1
El problema sería '0001' < '2', quizás.
kiamlaluno

Respuestas:

16

Estoy haciendo muchas condiciones como esa en consultas de entidades, aún no he encontrado un problema.

Lo principal que debe tener en cuenta es la zona horaria en la que se almacenan los datos, que es UTC. Debe convertirlo a la zona horaria de almacenamiento (hay una constante para eso), o su consulta se desactivará por unas horas.

Aquí hay un ejemplo basado en algo que estoy haciendo, si solo almacena días, entonces hay una constante para formatear eso también.

$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
fuente
Esto funcionó muy bien para un campo con marca de tiempo: en la base de datos, el almacenamiento era similar 2016-07-18T13:00:00, pero Drupal manejó la conversión y la comparación correctamente usando esta configuración.
geerlingguy