2014-11-14 3 views
3

возможно сортировать набор данных/компонентный набор по вычисленному/виртуальному/агрегированному столбцу?Сортировка списка данных с помощью подсчитанного/агрегированного столбца

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

В SQL я хотел бы сделать:

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

Как сделать это с SilverStripe ОРМ

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

дополнительный столбец, содержащий новое поле Длительность и заполнения этого поля в onAfterWrite крюками не является предпочтительным ,

Возможно ли это?

Роберт

ответ

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

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

+0

Спасибо ... отлично работает .... – derRobert

0

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

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

sry для не be четкий. Сортировка должна обрабатываться silverstripe ORM ... не классический sql – derRobert

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

U можно вычислить этот дифференциал в выберите, чтобы показать и порядок, я использую 'AS DiffDate' для упрощения

+0

sry для того, чтобы не было ясно. Сортировка должна обрабатываться silverstripe ORM ... не классическая sql – derRobert