Как сделать entityQuery для диапазона дат с полем Date only в Drupal 8?

8

В Drupal 8 поле « Только дата» хранит данные в столбце varchar в формате CCYY-MM-DD , например, 2016-04-18 .

Таким образом, вы больше не можете просто делать больше, чем ( > = ), меньше, чем ( <= ) или аналогичную основанную на отметке времени entityQuery.

Есть ли простое решение о том, как с этим бороться? В частности, я пытаюсь сделать два запроса, один, где поле даты от 14 до 21 дней, и один, где поле даты 21 и более дней назад.

Расшифруйте
источник
Не >=работает? 20160318> = 20160218
kiamlaluno
Данные хранятся как XXXX-XX-XX(2016-04-18), поэтому технически это не число, поэтому выполнение числовых условий для них не будет действительным.
Расшифровка
1
'2016-04-18' > '2016-03-18'у меня работает и '2014-04-18' > '2018-02-01'возвращается FALSE. Да, это сравнение строк, но учитывая формат строки, оно должно работать. В конце концов '1' < '2'.
kiamlaluno
1
Возможно, проблема в том '0001' < '2',
kiamlaluno

Ответы:

16

Я выполняю множество подобных условий в запросах сущностей, но еще не столкнулся с проблемой.

Главное, что вы должны знать, это часовой пояс, в котором хранятся данные, это UTC. Вам нужно преобразовать его во временную зону хранилища (для этого есть константа), иначе ваш запрос будет отключен через несколько часов.

Вот пример, основанный на том, что я делаю, если вы храните только дни, то есть константа для форматирования.

$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
источник
Это отлично работало для поля с меткой времени - в базе данных хранилище было похоже 2016-07-18T13:00:00, но Drupal правильно обработал преобразование и сравнение, используя эту настройку.
geerlingguy