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

ltqd579y  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(138)

我在存储过程中的代码:

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

khbbv19g

khbbv19g1#

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

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

字符串
你应该没事

6jjcrrmo

6jjcrrmo2#

另一个问题可能发生时,你想排序的日期差异(比方说天数之间的两天)。
例如,这样的排序将返回9(天)之前的数字13(天)。
解决方案是将日期差异的长度和差异本身连接起来:

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

字符串

相关问题