如何将计算列的数字格式转换为时间(hh:mm:ss)格式,sql查询

rm5edbpk  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(295)

首先我很抱歉英语不好,但我会尽量让人理解的。
我试图做一个oracle数据库sql查询,它减去两个现有列的datetime值,我设法使用下面所示的指令来做,但是我创建的列速度返回数字格式。

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格式转换为'hh:mm:ss'格式的时间,如果一些结果经过24小时,它会像32:01:20一样添加(就像[hh:mm:ss excel格式一样)。
我尝试了一些类似下面的指令的操作,但是它返回ora-00932错误不一致的数据类型、预期时间和返回日期julian(我不知道它是否是准确的错误描述,我的dbx是葡萄牙语的),不幸的是,如果有帮助的话,我不能对根表做任何更改。

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

无论如何,列速度格式是time是非常重要的,因为我将使用sql查询作为powerbi direct query的指令,并且我无法导入数据库以使用powerquery,因为它的数据太大。
谢谢大家!

v9tzhpje

v9tzhpje1#

函数使它更漂亮。它返回的天数格式为 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

看看是否有用。

xzv2uavs

xzv2uavs2#

在littlefoots的帮助下,我设法将列转换为所需的格式,如下所示:

CREATE OR REPLACE FUNCTION WMS_CORINGA(TEMPO NUMBER)
RETURN VARCHAR2 IS
HORA NUMBER;
MINUTO NUMBER(2);
SEGUNDO NUMBER(2);
TEMPOABS NUMBER;
BEGIN
IF TEMPO <> 0 THEN
TEMPOABS := ABS(TEMPO);
HORA := TRUNC(TEMPOABS*24);
MINUTO := TRUNC(((TEMPOABS*24)-HORA) * 60);
SEGUNDO := ((((TEMPOABS*24)-HORA) * 60) - MINUTO) * 60;
RETURN TO_CHAR(HORA, 'FM9999900') || ':'|| TO_CHAR(MINUTO, 'FM00') || ':' || TO_CHAR (SEGUNDO, 'FM00');
ELSE
RETURN '';
END IF;
END;

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

但我无法建立powerbi连接,输出是details:“当前不支持此本机数据库查询。”
总之,我学到了很多。

weylhg0b

weylhg0b3#

可以在减法之前将日期转换为时间戳。减法的结果是表示为“days hh24:mi:ss.fff”的间隔。如有必要,可以使用提取功能拉出各个组件。这样,您既没有难看的查询,也不需要创建函数。

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;

相关问题