Как преобразовать числовой формат вычисляемого столбца в формат времени (чч: мм: сс), sql запрос - PullRequest
0 голосов
/ 07 августа 2020

Сначала прошу прощения за бедный Engli sh, но я постараюсь быть максимально понятным.

Я пытаюсь сделать Oracle База данных SQL Запрос, который вычитает значение datetime двух существующих столбцов, мне удалось сделать это с помощью инструкции, показанной ниже, но созданный мной столбец TEMPO возвращается в формате ЧИСЛО.

SELECT M.NUMOS, M.CODFUNCOS, M.DTINICIOOS, M.DTFIMSEPARACAO,
M.DTFIMSEPARACAO - M.DTINICIOOS AS TEMPO 
FROM PCMOVENDPEND M
WHERE DTFIMSEPARACAO IS NOT NULL
AND DATA >= SYSDATE-1

Результат готов.

Вывод

Мне нужно преобразовать формат TEMPO столбца в TIME как 'hh: mm: ss', и если некоторые результаты проходят через 24 часа, он продолжает добавлять вроде 32: 01:20 (точно так же, как форматирование [hh]: mm: ss Excel).

Я пробовал несколько вещей, подобных приведенной ниже инструкции, но она возвращает Ошибка ORA-00932 несогласованный тип данных, ожидаемое ВРЕМЯ и вернул ДАТУ ДЖУЛИАН (я не знаю, точное ли это описание ошибки, мой DBX на португальском языке), к сожалению, я не могу вносить какие-либо изменения в таблицы root, если это поможет.

SELECT M.NUMOS, M.CODFUNCOS, M.DTINICIOOS, M.DTFIMSEPARACAO,
CAST(M.DTFIMSEPARACAO - M.DTINICIOOS AS TIME) AS TEMPO 
FROM PCMOVENDPEND M
WHERE DTFIMSEPARACAO IS NOT NULL
AND DATA >= SYSDATE-1

Все равно так важно, чтобы столбец Формат TEMPO - это TIME, потому что я буду использовать запрос sql в качестве инструкции для PowerBi Direct Query, и я не могу импортировать базу данных для работы с PowerQuery, так как это слишком большие данные.

Всем спасибо!

Ответы [ 3 ]

0 голосов
/ 07 августа 2020
• 1000 «Этот собственный запрос к базе данных в настоящее время не поддерживается».

В любом случае, многому научился.

0 голосов
/ 07 августа 2020

Перед вычитанием даты можно преобразовать в метки времени. Результатом вычитания является интервал , представленный как «days hh24: mi: ss.fff». При необходимости вы можете использовать функцию extract для извлечения отдельных компонентов. Таким образом, у вас не будет ни уродливого запроса, ни необходимости в создании функции.

with the_dates( dt1, dt2) as 
   ( select to_date('07.08.2020 14:25', 'dd.mm.yyyy hh24:mi:ss')
          , to_date('03.08.2020 13:20', 'dd.mm.yyyy hh24:mi:ss')  
       from dual
   ) 
select dt1, dt2, cast(dt1 as timestamp) - cast(dt2 as timestamp) result
  from the_dates;
0 голосов
/ 07 августа 2020

Функция делает его красивее. Он возвращает количество дней в формате dd:hh:mi:ss.

SQL> create or replace function f_days2ddhhmiss (par_broj_dana in number)
  2     return varchar2
  3  is
  4     l_broj_dana  number := par_broj_dana;
  5     retval       varchar2 (20);
  6  begin
  7     with podaci
  8          as (select trunc (l_broj_dana) broj_dana,
  9                     round (mod (l_broj_dana * 24, 24), 2) broj_sati,
 10                     round (mod (l_broj_dana * 24 * 60, 60), 2) broj_minuta,
 11                     round (mod (l_broj_dana * 24 * 60 * 60, 60), 2)
 12                        broj_sekundi
 13                from dual)
 14     select    lpad (p.broj_dana, 2, '0')
 15            || ':'
 16            || lpad (trunc (p.broj_sati), 2, '0')
 17            || ':'
 18            || lpad (trunc (p.broj_minuta), 2, '0')
 19            || ':'
 20            || lpad (trunc (p.broj_sekundi), 2, '0')
 21       into retval
 22       from podaci p;
 23
 24     return retval;
 25  end f_days2ddhhmiss;
 26  /

Function created.

Пример:

Без него вы получите десятичное число:

SQL> select to_date('07.08.2020 14:25', 'dd.mm.yyyy hh24:mi:ss')
  2       - to_date('03.08.2020 13:20', 'dd.mm.yyyy hh24:mi:ss') result
  3  from dual;

    RESULT
----------
4,04513889

С его помощью вы получите то, что хотели:

SQL> select f_days2ddhhmiss(to_date('07.08.2020 14:25', 'dd.mm.yyyy hh24:mi:ss')
  2                       - to_date('03.08.2020 13:20', 'dd.mm.yyyy hh24:mi:ss')
  3                        ) result
  4  from dual;

RESULT
--------------------------------------------------------------------------------
04:01:05:00

SQL>

Да, такой (или аналогичный) код можно использовать непосредственно в SQL, но он делает оператор SELECT некрасивым и его трудно читать.

Ваш запрос тогда будет

SELECT m.numos,
       m.codfuncos,
       m.dtinicioos,
       m.dtfimseparacao,
       f_days2ddhhmiss (m.dtfimseparacao - m.dtinicioos) AS tempo
  FROM pcmovendpend m
 WHERE     dtfimseparacao IS NOT NULL
       AND data >= SYSDATE - 1

Посмотрим, поможет ли.

...