0

我在存储过程中的代码:

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

谢谢

4

2 回答 2

1

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

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

你应该没事。

于 2012-08-13T18:59:30.110 回答
-1

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

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

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

length(trunc(date2) - trunc(date1)) || to_char(date2 - date1)
于 2015-04-08T07:32:22.847 回答