我在存储过程中的代码:
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;
问题是排序是基于char完成的,这对于日期案例来说是错误的。但是,CASE语句不允许除char之外的任何其他数据类型。那么这种情况下的解决方案是什么?我需要能够将p_order_by_field传递给存储过程。
由于
答案 0 :(得分:1)
应该很简单 - 只需在您的情况下使用ISO日期格式:
TO_CHAR(IR.IDATE, 'yyyy-mm-dd')
你应该没事。
答案 1 :(得分:-1)
当您想要对日期差异进行排序时,可能会出现另一个问题(比如两天之间的天数)。
例如,这样的排序将在9(天)之前返回13(天)。
解决方案是你连接日期差异的长度和差异本身:
length(trunc(date2) - trunc(date1)) || to_char(date2 - date1)