使用CASE在Oracle中按日期数据类型动态排序

时间:2012-08-13 18:08:46

标签: oracle sql-order-by case-statement

我在存储过程中的代码:

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传递给存储过程。

由于

2 个答案:

答案 0 :(得分:1)

应该很简单 - 只需在您的情况下使用ISO日期格式:

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

你应该没事。

答案 1 :(得分:-1)

当您想要对日期差异进行排序时,可能会出现另一个问题(比如两天之间的天数)。

例如,这样的排序将在9(天)之前返回13(天)。

解决方案是你连接日期差异的长度和差异本身:

length(trunc(date2) - trunc(date1)) || to_char(date2 - date1)