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;

問題は、ソートが char に基づいて行われることです。これは、日付の場合には間違っています。ただし、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

日付の違い (たとえば、2 日間の日数) で並べ替える場合、別の問題が発生する可能性があります。

たとえば、このような並べ替えでは、9 (日) の前に 13 (日) の数値が返されます。

解決策は、日付の差の長さと差自体を連結することです。

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