Динамический порядок данных по дате в 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)