Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Форматирование результата после EXTRACT  [new]
TopCore
Member

Откуда: Mariupol, Ukraine
Сообщений: 871
Здравствуйте!
Есть следующий запрос
SELECT
    EXTRACT(HOUR   FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) || ':' ||
    EXTRACT(MINUTE FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) || ':' ||
    EXTRACT(SECOND FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) diff
FROM
    t
WHERE
    t.id = :id

Возвращает он, например, следующее:
0:3:9

Т.е. 0 часов 3 минуты и 9 секунд.
Как можно форматнуть данный результат, чтобы при необходимости лидирующие нули отображались?

Спасибо.
17 июн 15, 16:17    [17783195]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
TopCore,

не поверите - to_char
три раза
17 июн 15, 16:20    [17783213]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
isdenno
Member

Откуда:
Сообщений: 92
TopCore,

SELECT
    RPAD(EXTRACT(HOUR   FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') || ':' ||
    RPAD(EXTRACT(MINUTE FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') || ':' ||
    RPAD(EXTRACT(SECOND FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') diff
FROM
    t
WHERE
    t.id = :id
17 июн 15, 16:46    [17783368]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
isdenno
TopCore,

SELECT
    RPAD(EXTRACT(HOUR   FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') || ':' ||
    RPAD(EXTRACT(MINUTE FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') || ':' ||
    RPAD(EXTRACT(SECOND FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') diff
FROM
    t
WHERE
    t.id = :id

только уж тогда добавляйте то - слева
17 июн 15, 16:57    [17783433]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
isdenno
Member

Откуда:
Сообщений: 92
orawish,

мышка не сбалансирована )
17 июн 15, 17:07    [17783504]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
TopCore
Member

Откуда: Mariupol, Ukraine
Сообщений: 871
isdenno, orawish, спасибо вам большое. LPAD сразу сделал. А вот с TO_CHAR (хоть и работал неоднократно, но видимо недостаточно) не получилось.
SELECT
    EXTRACT(HOUR   FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) || ':' ||
    EXTRACT(MINUTE FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) || ':' ||
    EXTRACT(SECOND FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) AS extract_diff

   ,TO_CHAR(EXTRACT(HOUR   FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), '09') || ':' ||
    TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), '99') || ':' ||
    TO_CHAR(EXTRACT(SECOND FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), '00') AS to_char_diff

   ,LPAD(EXTRACT(HOUR   FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') || ':' ||
    LPAD(EXTRACT(MINUTE FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') || ':' ||
    LPAD(EXTRACT(SECOND FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')), 2, '0') AS lpad_diff
FROM
    t
WHERE
    t.id = :id

Результат
extract_diffto_char_difflpad_diff
0:33:3200: 33: 3200:33:32

TO_CHAR добавляет лидирующие пробелы. Что можно сделать, чтобы пробелы не появлялись?
18 июн 15, 09:40    [17785972]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
SELECT '*'|| to_char(1, '09') ||'*'
FROM dual

------------

SELECT '*'|| to_char(1, 'fm09') ||'*'
FROM dual
18 июн 15, 09:54    [17786026]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
TopCore
Member

Откуда: Mariupol, Ukraine
Сообщений: 871
tru55, спасибо. Слона-то (fm) я и не приметил.
18 июн 15, 11:19    [17786484]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
Arkon_320
Member

Откуда: Беларусь, Минск
Сообщений: 30
TopCore,

Твою задачу можно решить более элегантно, без кучи экстрактов:
1) добавить интервал к дате без времени
2) полученную дату вывести только со временем ('hh24:mi:ss')

Вот пример:
select 
  to_char ( date'1900-01-01' + NUMTODSINTERVAL(999, 'second')
          , 'hh24:mi:ss' ) val    
from 
  dual

для твоего случая:
select 
  to_char ( date'1900-01-01' + NUMTODSINTERVAL(t.dlit, 'second')
          , 'hh24:mi:ss' ) val    
from 
  t
24 июн 15, 00:18    [17809086]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
proxy1
Member

Откуда:
Сообщений: 125
TopCore
Здравствуйте!
Есть следующий запрос
SELECT
    EXTRACT(HOUR   FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) || ':' ||
    EXTRACT(MINUTE FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) || ':' ||
    EXTRACT(SECOND FROM NUMTODSINTERVAL(SUM(t.dlit), 'SECOND')) diff
FROM
    t
WHERE
    t.id = :id

Возвращает он, например, следующее:
0:3:9

Т.е. 0 часов 3 минуты и 9 секунд.
Как можно форматнуть данный результат, чтобы при необходимости лидирующие нули отображались?

Спасибо.


Интервал гарантированно имеет длительность менее 24 часов?
Если нет, то рискуете "потерять" дни.
25 июн 15, 14:08    [17815540]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
TopCore
Member

Откуда: Mariupol, Ukraine
Сообщений: 871
proxy1, этот временной параметр менее суток, поэтому не потеряю дни. Спасибо :)
25 июн 15, 14:25    [17815629]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
TopCore
Member

Откуда: Mariupol, Ukraine
Сообщений: 871
Arkon_320, спасибо, очень интересное решение.
25 июн 15, 14:27    [17815641]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
vaneque
Member

Откуда: Тверь
Сообщений: 168
Да, интересное решение, при условии, что t.dlit будет меньше 86400. Можно такой вариант (не самый удобочитаемый):

WITH t(dlit) AS (SELECT 1000*ROWNUM FROM dual CONNECT BY LEVEL<=150)
SELECT 
  to_char(trunc(dlit/3600),'fm09') ||':' || to_char(trunc(mod(dlit,3600)/60),'fm09')||':' || to_char(mod(dlit,60),'fm09')
FROM t;


Arkon_320
TopCore,

Твою задачу можно решить более элегантно, без кучи экстрактов:
1) добавить интервал к дате без времени
2) полученную дату вывести только со временем ('hh24:mi:ss')

Вот пример:
select 
  to_char ( date'1900-01-01' + NUMTODSINTERVAL(999, 'second')
          , 'hh24:mi:ss' ) val    
from 
  dual

для твоего случая:
select 
  to_char ( date'1900-01-01' + NUMTODSINTERVAL(t.dlit, 'second')
          , 'hh24:mi:ss' ) val    
from 
  t
25 июн 15, 15:26    [17815985]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
субстр(тучар())
Guest
Может я чего не понимаю в мазохизме, но делить интервал на части и склеивать обратно только ради того, чтобы потом бороться с дополнением нулями...
25 июн 15, 16:01    [17816177]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
vaneque
Member

Откуда: Тверь
Сообщений: 168
Не совсем...ради того, чтобы не работать с остатком от деления на 86400, и не понимать этого:

WITH t(dlit) AS (SELECT round(300000*dbms_random.VALUE) FROM dual CONNECT BY LEVEL<=10)
SELECT 
   trunc(dlit/86400) "Сколько целых суток?", to_char(trunc(SYSDATE)+numtodsinterval(t.dlit,'second'),'HH24:MI:SS' ) "Что в результате?"
FROM t
ORDER BY 1;


"Сколько целых суток?""Что в результате?"
018:41:07
004:20:35
113:21:21
109:50:57
107:36:16
216:37:26
222:16:19
203:05:46
201:33:01
310:56:23


Но раз ТС говорит, что в его бизнес-задаче больше суток быть не может, проблем с вариантом Arkon_320 не будет.

субстр(тучар())
Может я чего не понимаю в мазохизме, но делить интервал на части и склеивать обратно только ради того, чтобы потом бороться с дополнением нулями...
25 июн 15, 16:33    [17816370]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
Elic
Member

Откуда:
Сообщений: 29976
vaneque
to_char(trunc(SYSDATE)
Похоже, главного ты и не понял.
+
to_char(numtodsinterval(
25 июн 15, 17:23    [17816701]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование результата после EXTRACT  [new]
vaneque
Member

Откуда: Тверь
Сообщений: 168
Elic
vaneque
to_char(trunc(SYSDATE)
Похоже, главного ты и не понял.
+
to_char(numtodsinterval(


Ну, я еще учусь... Понял пока только так:
WITH t(dlit) AS (SELECT round(86400*dbms_random.VALUE) FROM dual CONNECT BY LEVEL<=10)
SELECT substr(numtodsinterval(dlit,'SECOND'),12,8) FROM t ORDER BY 1;
--to_char с паттерном времени не отрабатывает
--SELECT to_char(numtodsinterval(dlit,'SECOND'),'HH24:MI:SS') FROM t ORDER BY 1; --выдает +000000000 02:46:28.000000000 и пр.
25 июн 15, 17:53    [17816853]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить