Como fazer um queryQuery entityQuery com um campo Date only no Drupal 8?

8

No Drupal 8, o campo Data apenas armazena dados em uma coluna varchar no formato CCYY-MM-DD , por exemplo, 18/04/2016 .

Dessa forma, você não pode simplesmente fazer mais uma entidadeQuery maior que ( > = ), menor que ( <= ) ou carimbo de data / hora semelhante.

Existe uma solução simples sobre como lidar com isso? Especificamente, estou tentando fazer duas consultas, uma em que o campo de data tenha entre 14 e 21 dias e uma em que o campo de data tenha 21 e mais dias.

Decifrar
fonte
Não >=funciona? 20160318> = 20160218
kiamlaluno
Os dados são armazenados como XXXX-XX-XX(18/04/2016), portanto, tecnicamente, não é um número, portanto, fazer uma condição numérica contra eles não seria válido.
decifrar
11
'2016-04-18' > '2016-03-18'funciona para mim e '2014-04-18' > '2018-02-01'retorna FALSE. Sim, é uma comparação de cadeias, mas, dado o formato da cadeia, deve funcionar. Afinal '1' < '2',.
Kiamlaluno
11
O problema seria com '0001' < '2', talvez.
Kiamlaluno

Respostas:

16

Estou fazendo muitas condições como essa nas consultas de entidade, ainda não encontrei um problema.

A principal coisa que você deve estar ciente é o fuso horário em que os dados são armazenados, que são UTC. Você precisa convertê-lo para o fuso horário de armazenamento (existe uma constante para isso), ou sua consulta será desativada em algumas horas.

Aqui está um exemplo baseado em algo que estou fazendo, se você armazenar apenas dias, também há uma constante para formatar isso.

$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
fonte
Isso funcionou muito bem para um campo com registro de data e hora - no banco de dados era o armazenamento 2016-07-18T13:00:00, mas Drupal lidou com a conversão e a comparação corretamente usando essa configuração.
precisa saber é o seguinte