Динамический порядок данных по дате в Oracle с использованием CASE

Мой код в хранимой процедуре:

SELECT * FROM
my_table ir
WHERE 
--where clause goes here
ORDER BY   
       CASE  WHEN p_order_by_field='Id' AND p_sort_order='ASC'  THEN IR.ID end,
       CASE  WHEN p_order_by_field='Id' AND p_sort_order='DESC'  THEN IR.ID end DESC,
       CASE  WHEN p_order_by_field='Date' AND p_sort_order='ASC'  THEN TO_CHAR(IR.IDATE, 'MM/dd/yyyy') end,
       CASE  WHEN p_order_by_field='Date' AND p_sort_order='DESC'  THEN TO_CHAR(IR.IDATE, 'MM/dd/yyyy') end DESC;

Проблема в том, что сортировка выполняется на основе символа, который не подходит для случая с датой. Оператор CASE, однако, не разрешает использовать любой другой тип данных, кроме char. Так каково решение в этом случае? Мне нужно иметь возможность передать поле p_order_by_field в хранимую процедуру.

Спасибо

2 ответа

Решение

Должно быть просто - просто используйте формат даты ISO в вашем случае:

TO_CHAR(IR.IDATE, 'yyyy-mm-dd')

и ты должен быть в порядке.

Другая проблема может возникнуть, если вы хотите отсортировать разницу дат (скажем, количество дней между двумя днями).

Например, такая сортировка будет возвращать число 13 (дней) до 9 (дней).

Решение состоит в том, что вы объединяете длину разницы дат и саму разницу:

length(trunc(date2) - trunc(date1)) || to_char(date2 - date1)
Другие вопросы по тегам