интервал форматирования с to_char - PullRequest
5 голосов
/ 09 июня 2009

Следующая команда SQL

select TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))) from table1

создает результат в формате: +000000000 00: 03: 01.954000.

Можно ли ввести специальный формат в функцию to_char, чтобы получить результат в формате: +00 00: 00: 00.000?

Ответы [ 6 ]

19 голосов
/ 09 июня 2009

Вы можете разыграть результат, если хотите меньше точности:

SQL> SELECT TO_DSINTERVAL('10 10:00:00') t_interval FROM dual;

T_INTERVAL
-----------------------------------------------------------
+000000010 10:00:00.000000000

SQL> SELECT CAST(TO_DSINTERVAL('10 10:00:00')
  2                 AS INTERVAL DAY(2) TO SECOND(3)) t_interval
  3    FROM dual;

T_INTERVAL
-----------------------------------------------------------
+10 10:00:00.000

Редактировать следующий комментарий OP:

Из документации Oracle (11гр1) :

Типы интервальных данных не имеют форматных моделей. Поэтому для настройки их представления необходимо объединить символьные функции, такие как EXTRACT, и объединить компоненты.

Похоже, вам придется вручную использовать EXTRACT для достижения желаемого результата:

SQL> SELECT to_char(extract(DAY FROM t_interval), 'fmS99999') || ' ' ||
  2         to_char(extract(HOUR FROM t_interval), 'fm00') || ':' ||
  3         to_char(extract(MINUTE FROM t_interval), 'fm00') || ':' ||
  4         to_char(extract(SECOND FROM t_interval), 'fm00.000')
  5    FROM (SELECT TO_DSINTERVAL('10 01:02:55.895') t_interval FROM dual)
  6  ;

TO_CHAR(EXTRACT(DAYFROMT_INTER
------------------------------
+10 01:02:55.895


Это не очень элегантно, но, похоже, это единственный способ справиться с точностью до микросекунд.

8 голосов
/ 29 ноября 2010

to_char (), кажется, имеет фиксированный формат :( поэтому может быть опция regexp_substr, например:

SELECT regexp_substr (TO_DSINTERVAL ('10 10:00:00'), '\d{2} \d{2}:\d{2}:\d{2}\.\d{3}') t_interval FROM dual
4 голосов
/ 09 июня 2009

Я понимаю, что это совсем не умно и не является строкой специального формата, которую вы ищете, но этот ответ работает, учитывая, что вывод имеет фиксированную длину:

SELECT    SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 1, 1)
       || SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 9, 2)
       || ' '
       || SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 12, 12)
  FROM table1;

Он также просто сокращает доли секунды вместо округления, но я предполагаю, что из вашего примера они все равно просто нули.

Это еще большее смущение, но я не удержался:

SELECT SUBSTR(REPLACE(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00')))
                     , '0000000', '')
             , 1, 16)
  FROM table1;
2 голосов
/ 29 октября 2014

Небольшой случай некромантии потоков, однако я столкнулся с этим вопросом, когда искал способ форматирования интервала, поэтому я подумал, что стоит добавить этот комментарий.

Из документации Oracle добавление временной отметки к интервалу приводит к временной отметке, поэтому, добавив постоянную временную отметку с нулевыми элементами времени, вы можете использовать стандартные элементы формата to_char для свидания ...

SELECT TO_CHAR( TIMESTAMP'1969-12-31 00:00:00' + TO_DSINTERVAL('0 00:03:01.954321'),
  'HH24:MI:SS.FF3' ) FROM dual;

Однако , существует проблема, если интервалы могут превышать день. Для дней нет элемента форматирования, который будет равен 0. "DDD" - это день года, поэтому в приведенном выше примере будет 365 или 1 или более, если интервал был больше дня. Это нормально, если ваши интервалы меньше 24 часов.

Следует добавить, что это на 11g, поэтому вполне может быть неприменимо к OP.

0 голосов
/ 21 марта 2018
SELECT W.SHIFT_NUMB || ' c: ' ||
       TO_CHAR(TO_DATE('01.01.2012', 'dd.mm.yyyy') + W.TIMEFROM, 'HH24:MI') ||
       ' по: ' ||
       TO_CHAR(TO_DATE('01.01.2012', 'dd.mm.yyyy') + W.TIMETO, 'HH24:MI'),
       w.ID
  FROM AC_WORK_SHIFT W
 WHERE W.CLIENT_ID = GC

Просто добавьте дату и используйте to_char ('HH24: MI')!

0 голосов
/ 02 февраля 2016

Вы можете вырезать последнюю часть (или любую часть) с регулярным выражением Oracle REGEXP_REPLACE делает именно это.

выберите REGEXP_REPLACE (TO_CHAR (NVL (arg1 - arg2, TO_DSINTERVAL ('0 00:00:00'))), '.. *') из таблицы1

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