如何在Drupal 8中使用仅日期字段进行日期范围的EntityQuery?


8

在Drupal 8中,仅日期字段将数据以CCYY-MM-DD格式存储在varchar列中,例如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

Answers:


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

这对于带有时间戳的字段非常有用-在数据库中,存储就像2016-07-18T13:00:00,但是Drupal使用此设置正确处理了转换和比较。
geerlingguy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.