Сортировать DataList по вычисленному / агрегированному столбцу

Можно ли отсортировать Datalist / ComponentSet по вычисленному / виртуальному / агрегированному столбцу?

У меня есть DataList, содержащий события, имеющие StartDate и EndDate.
Теперь я хочу отсортировать список по продолжительности события (от самого короткого до самого длинного).

В SQL я бы сделал:

... ORDER BY DATEDIFF(EndDate, StartDate) ASC

Как это сделать с помощью Silverstripe ORM

$list = Event::get()->sort('????');

Дополнительный столбец, содержащий новую Field Duration и заполняющий это поле в onAfterWrite-hooks, не является предпочтительным.

Это возможно ?

Роберт

3

Решение

$list = Event::get()->sort(array('DATEDIFF("EndDate", "StartDate")' => 'ASC'));

DataList::sort не выполняет экранирования, поэтому любое допустимое предложение ORDER BY будет работать нормально.

6

Другие решения

SELECT StartDate,EndDate,DATEDIFF(EndDate, StartDate) AS DiffDate FROM myTable ORDER BY DiffDate ASC

Вы можете рассчитать этот дифференциал в select, чтобы показать его и порядок, я использую «AS DiffDate», чтобы упростить

1

Вы можете использовать это так:

SELECT *, DATEDIFF(EndDate, StartDate) as duration FROM table WHERE conditional = 1 ORDER BY duration ASC
0