Làm cách nào để thực hiện một phạm vi thực thể trong phạm vi ngày với trường Chỉ ngày trong Drupal 8?


8

Trong Drupal 8, trường Ngày chỉ lưu trữ dữ liệu trong một cột varchar theo định dạng CCYY-MM-DD , ví dụ: 2016-04-18 .

Như vậy, bạn không thể đơn giản làm lớn hơn ( > = ), ít hơn ( <= ) hoặc thực thể dựa trên dấu thời gian tương tự nữa.

Có một giải pháp đơn giản về cách đối phó với điều này? Cụ thể, tôi đang cố gắng thực hiện hai truy vấn, một truy vấn trong đó trường ngày nằm trong khoảng từ 14 đến 21 ngày và một trong đó trường ngày là 21 và hơn ngày.


Không >=hoạt động? 20160318> = 20160218
kiamlaluno

Dữ liệu được lưu trữ dưới dạng XXXX-XX-XX(2016-04-18), do đó về mặt kỹ thuật không phải là số, do đó, việc thực hiện một điều kiện số đối với dữ liệu sẽ không hợp lệ.
Giải mã

1
'2016-04-18' > '2016-03-18'làm việc cho tôi, và '2014-04-18' > '2018-02-01'trả lại FALSE. Vâng, đó là một so sánh chuỗi, nhưng với định dạng chuỗi, nó sẽ hoạt động. Sau khi tất cả, '1' < '2'.
kiamlaluno

1
Vấn đề sẽ là với '0001' < '2', có thể.
kiamlaluno

Câu trả lời:


16

Tôi đang làm nhiều điều kiện như thế trong các truy vấn thực thể, tôi chưa gặp phải vấn đề nào.

Điều chính bạn phải nhận thức được là múi giờ dữ liệu được lưu trữ, đó là UTC. Bạn cần chuyển đổi nó thành múi giờ lưu trữ (có một hằng số cho điều đó) hoặc truy vấn của bạn sẽ bị tắt sau vài giờ.

Đây là một ví dụ dựa trên một cái gì đó tôi đang làm, nếu bạn chỉ lưu trữ ngày, thì cũng có một hằng số để định dạng đó.

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

Điều này hoạt động rất tốt cho một trường có dấu thời gian trong cơ sở dữ liệu lưu trữ giống như thế 2016-07-18T13:00:00, nhưng Drupal đã xử lý việc chuyển đổi và so sánh đúng cách bằng cách sử dụng thiết lập này.
ge Muffguy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.