Sorting on different Date fields from different content types

The Problem

Is there a way to sort a view by date when I use two different date fields?

I need a view with events of two content types, and each content type has its own date field.

I don't see an option to combine the date fields into one sortable field.

(I can combine them in a Views custom text field, but those aren't sortable.)

The Solution

We need to treat the NULL values as 0

For each record we need to know the greatest value.

This was the expression:

 greatest(coalesce(`field_data_field_event_date`.`field_event_date_value`, 0), coalesce(`field_data_field_other_date`.`field_other_date_value`, 0))

But it didn't work unless those other fields are also added as sort criteria.  If we add them below the expression then they will have no effect on the sort order.

This is what the resulting View SQL looked like

SELECT `node`.`title` AS `node_title`, `node`.`nid` AS `nid`,
`field_data_field_event_date`.`field_event_date_value` AS `field_data_field_event_date_field_event_date_value`, `field_data_field_other_date`.`field_other_date_value` AS `field_data_field_other_date_field_other_date_value`,
'node' AS `field_data_field_event_date_node_entity_type`,
'node' AS `field_data_field_other_date_node_entity_type`,
greatest(coalesce(`field_data_field_event_date`.`field_event_date_value`, 0), coalesce(`field_data_field_other_date`.`field_other_date_value`, 0)) AS `views_sort_expression_0`
FROM 
{node} `node`
LEFT JOIN {field_data_field_event_date} `field_data_field_event_date` ON node.nid = field_data_field_event_date.entity_id AND (field_data_field_event_date.entity_type = 'node' AND field_data_field_event_date.deleted = '0')
LEFT JOIN {field_data_field_other_date} `field_data_field_other_date` ON node.nid = field_data_field_other_date.entity_id AND (field_data_field_other_date.entity_type = 'node' AND field_data_field_other_date.deleted = '0')
WHERE (( (`node`.`status` = '1') AND (`node`.`type` IN  ('event', 'event_other')) ))
ORDER BY views_sort_expression_0 ASC, field_data_field_event_date_field_event_date_value ASC, field_data_field_other_date_field_other_date_value ASC

And this is what the result looked like before combining the fields displayed:

They are now sorted by date.

 

 

views_sort_expression
Module