怎样按日期排序LIST集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样按日期排序LIST集合相关的知识,希望对你有一定的参考价值。

参考技术A .net 可用 list.OrderBy(t=>t.date)

如何解析此 JSON 以填充到 APEX 集合中并按日期排序

【中文标题】如何解析此 JSON 以填充到 APEX 集合中并按日期排序【英文标题】:How to parse this JSON to populate into APEX Collection and sort by date 【发布时间】:2020-12-06 05:17:52 【问题描述】:

我在JSON 下方使用APEX_JSONOracle 11gR2 数据库中进行解析。 我的要求是按closed_at 对日期进行排序并选择最新的close_reason。我正在考虑将closed_atclose_reason 填充到APEX 集合中。对 apex_collections 中的日期进行降序排序以选择最新的close_reason

请你帮忙写一下APEX_JSON.get_countAPEX_JSON.get_varchar2来获取closed_atclose_reason

"openings": [
                "id": 5003,
                "opening_id": null,
                "status": "closed",
                "opened_at": "2020-11-30T20:09:56.487Z",
                "closed_at": "2020-12-02T22:43:45.736Z",
                "application_id": 76370003,
                "close_reason": null
            , 
                "id": 8003,
                "opening_id": null,
                "status": "closed",
                "opened_at": "2020-11-30T20:59:02.267Z",
                "closed_at": "2020-12-04T11:07:26.087Z",
                "application_id": 45990003,
                "close_reason": 
                    "id": 7003,
                    "name": "Hire - New Headcount"
                
            
        ]
   

谢谢 基肖尔

【问题讨论】:

【参考方案1】:

在使用APEX_JSON.GET_VARCHAR2()之前,需要在PL/SQL代码中解析APEX_JSON.PARSE()。除了使用 PL/SQL,还可以通过使用XMLTABLE 直接使用 SQL,例如

WITH t1 AS
(
SELECT APEX_JSON.TO_XMLTYPE(jsdata) AS xml_data
  FROM t0 -- suppose your json data is inserted into jsdata column of this table
), t2 AS
(
  SELECT close_reason,
         ROW_NUMBER() OVER 
        (ORDER BY TO_TIMESTAMP(closed_at, 'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"') DESC) AS rn
    FROM t1
   CROSS JOIN
         XMLTABLE('/json/openings/row'
                  PASSING xml_data
                  COLUMNS 
                    closed_at    VARCHAR2(100) PATH 'closed_at',
                    close_reason VARCHAR2(900) PATH 'close_reason/name'
                 ) 
)
SELECT close_reason 
  FROM t2
 WHERE rn = 1  

为了带来最新的关闭原因。

如果你真的需要使用问题中给出的那些函数,那么使用下面的代码块

DECLARE
   v_json VARCHAR2(32767); 
   v_ct   OWA.VC_ARR;
   v_cr   OWA.VC_ARR; 
   TYPE ts IS TABLE OF TIMESTAMP INDEX BY BINARY_INTEGER; 
   v_ts   ts;
   v_ts1  TIMESTAMP;
   idx    INT;
BEGIN
   SELECT *
     INTO v_json
     FROM t0;  -- there's no WHERE clause assuming only one row is to be inserted
   APEX_JSON.PARSE(v_json);

   FOR i IN 1..APEX_JSON.GET_COUNT('openings')
   LOOP
     v_ct(i) := APEX_JSON.GET_VARCHAR2('openings['||i||'].closed_at');
     v_ts(i) := TO_TIMESTAMP(v_ct(i), 'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"');
     IF NVL(v_ts1, v_ts(i)) <= v_ts(i) THEN
       v_ts1 := v_ts(i);
       idx := i;
     END IF; 
     v_cr(i) := APEX_JSON.GET_VARCHAR2('openings['||i||'].close_reason.name');          
   END LOOP;    
   DBMS_OUTPUT.PUT_LINE(v_cr(idx));                     
END;
/
 

【讨论】:

以上是关于怎样按日期排序LIST集合的主要内容,如果未能解决你的问题,请参考以下文章

集合List根据多个字段进行排序

如何对List集合中的对象进行按某个属性排序

JAVA中List集合的汉字排序

C# 集合及集合内排序 问题 速求

如何对List集合中的对象进行排序?

将集合中的内容按时间排序