Drupal 8で日付のみのフィールドを使用して日付範囲entityQueryを実行する方法


8

Drupal 8では、「日付のみ」フィールドは、2016-04-18などのCCYY-MM-DD形式でvarchar列にデータを格納します。

そのため、単により大きい(> =)、より小さい(<=)、または同様のタイムスタンプベースのentityQueryを実行することはできません。

これに対処する方法の簡単な解決策はありますか?具体的には、2つのクエリを実行しようとしています。1つは日付フィールドが14〜21日経過したもので、もう1つは日付フィールドが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();

これは、タイムスタンプのあるフィールドに最適です。データベースでは、ストレージはのようでしたが2016-07-18T13:00:00、Drupalはこの設定を使用して変換と比較を適切に処理しました。
geerlingguy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.