首页 > 解决方案 > 如何将计算列的数字格式转换为时间(hh:mm:ss)格式,sql查询

问题描述

首先,我为糟糕的英语感到抱歉,但我会尽量让人们理解。

我正在尝试创建一个 Oracle 数据库 SQL 查询,它减去两个现有列的日期时间值,我使用下面显示的指令管理了如何执行此操作,但我创建的列 TEMPO 以 NUMBER 格式返回。

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 错误,数据类型不一致,预期 TIME 并返回 DATE 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

无论如何,列 TEMPO 格式是 TIME 非常重要,因为我将使用 sql 查询作为 PowerBi Direct Query 的指令,并且由于数据太大,我无法导入数据库以与 PowerQuery 一起使用。

感谢大家!

标签: sqloracledatetimeformattingjulian-date

解决方案


在 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 连接,输出为详细信息:“当前不支持此本机数据库查询。”

总之,学到了很多。


推荐阅读