Как я могу отсортировать строковые данные (формат времени 12 часов) в порядке возрастания? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть столбец с именем class_time, имеющий строковый формат, в котором данные хранятся как:

0730PM:0600PM:0800PM

Как я могу получить данные этого столбца как время восхода?

0600PM:0730PM:0800PM

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Вы можете использовать рекурсивный подзапрос и простые строковые функции, чтобы разбить строку на времена, а затем использовать LISTAGG, чтобы повторно объединить их упорядочение по возрастанию.

Тестовые данные :

CREATE TABLE test_data ( times ) AS
SELECT '0730PM:0600PM:0800PM' FROM DUAL UNION ALL
SELECT '0730PM:0730AM:0600PM' FROM DUAL UNION ALL
SELECT '0730PM:0730AM:0600PM' FROM DUAL UNION ALL
SELECT ( SELECT LISTAGG(
                  TO_CHAR( TRUNC( SYSDATE ) + ( LEVEL - 1 ) * INTERVAL '1' HOUR, 'HH12MIAM' ),
                  ':'
                ) WITHIN GROUP ( ORDER BY DBMS_RANDOM.VALUE() )
         FROM   DUAL
         CONNECT BY LEVEL <= 24 ) FROM DUAL;

Запрос :

WITH bounds ( rid, times, start_pos, end_pos ) AS (
  SELECT ROWID,
         times,
         1,
         INSTR( times, ':', 1 )
  FROM   test_data
UNION ALL
  SELECT rid,
         times,
         end_pos + 1,
         INSTR( times, ':', end_pos + 1 )
  FROM   bounds
  WHERE  end_pos > 0
),
time_strings ( rid, value ) AS (
  SELECT rid,
         CASE end_pos
         WHEN 0
         THEN SUBSTR( times, start_pos )
         ELSE SUBSTR( times, start_pos, end_pos - start_pos )
         END
  FROM   bounds
)
SELECT LISTAGG( value, ':' ) WITHIN GROUP ( ORDER BY TO_DATE( value, 'HH12MIAM' ) )
         AS times
FROM   time_strings
GROUP BY rid;

Выход :

| TIMES                                                                                                                                                                   |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0600PM:0730PM:0800PM                                                                                                                                                    |
| 0730AM:0600PM:0730PM                                                                                                                                                    |
| 0730AM:0600PM:0730PM                                                                                                                                                    |
| 1200AM:0100AM:0200AM:0300AM:0400AM:0500AM:0600AM:0700AM:0800AM:0900AM:1000AM:1100AM:1200PM:0100PM:0200PM:0300PM:0400PM:0500PM:0600PM:0700PM:0800PM:0900PM:1000PM:1100PM |

дБ <> скрипка здесь

0 голосов
/ 24 октября 2019

Например:

SQL> with test (id, col) as
  2    (select 1, '0730PM:0600PM:0800PM' from dual union all
  3     select 2, '0400PM:0300AM:0200AM' from dual union all
  4     select 3, '1130PM:1200AM:1230AM' from dual union all
  5     select 4, '1200AM:0100AM:0200AM' from dual
  6    ),
  7  temp as
  8    (select id,
  9            regexp_substr(col, '[^:]+', 1, column_value) val
 10     from test cross join table(cast(multiset(select level from dual
 11                                              connect by level <= regexp_count(col, ':') + 1
 12                                             ) as sys.odcinumberlist))
 13    )
 14  select id,
 15    listagg(val, ':') within group (order by to_date(val, 'hhmiam')) result
 16  from temp
 17  group by id;

        ID RESULT
---------- ------------------------------
         1 0600PM:0730PM:0800PM
         2 0200AM:0300AM:0400PM
         3 1200AM:1230AM:1130PM
         4 1200AM:0100AM:0200AM

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...