如何将计算列的数字格式转换为时间 (hh:mm:ss) 格式,sql 查询
How to convert number format of a calculated column to time (hh:mm:ss) format, sql query
首先,我对糟糕的英语表示抱歉,但我会尽量让您理解。
我正在尝试创建一个 Oracle 数据库 SQL 查询,该查询减去两个现有列的日期时间值,我使用下面显示的说明管理了如何执行此操作,但我创建的列 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
输出就这样了。
Output
我需要将列 TEMPO 格式转换为 'hh:mm:ss' 的时间格式,如果某些结果经过 24 小时,它会不断添加,如 32:01:20(就像 [hh]:mm:ss Excel 格式化)。
我尝试了一些类似下面指令的操作,但它 returns 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
无论如何,列 TEMPO 格式是 TIME 非常重要,因为我将使用 sql 查询作为 PowerBi Direct Query 的指令,我无法导入数据库以使用 PowerQuery因为数据太大了。
谢谢大家!
功能让它更漂亮。它 returns 天数 格式为 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
看看有没有帮助。
在 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 连接,输出是 详细信息:“当前不支持本机数据库查询。”
总之,学到了很多。
您可以在相减之前将日期转换为时间戳。减法的结果是一个 interval represented as "days hh24:mi:ss.fff". If necessary you can then use the 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;
首先,我对糟糕的英语表示抱歉,但我会尽量让您理解。
我正在尝试创建一个 Oracle 数据库 SQL 查询,该查询减去两个现有列的日期时间值,我使用下面显示的说明管理了如何执行此操作,但我创建的列 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
输出就这样了。
Output
我需要将列 TEMPO 格式转换为 'hh:mm:ss' 的时间格式,如果某些结果经过 24 小时,它会不断添加,如 32:01:20(就像 [hh]:mm:ss Excel 格式化)。
我尝试了一些类似下面指令的操作,但它 returns 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
无论如何,列 TEMPO 格式是 TIME 非常重要,因为我将使用 sql 查询作为 PowerBi Direct Query 的指令,我无法导入数据库以使用 PowerQuery因为数据太大了。
谢谢大家!
功能让它更漂亮。它 returns 天数 格式为 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
看看有没有帮助。
在 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 连接,输出是 详细信息:“当前不支持本机数据库查询。”
总之,学到了很多。
您可以在相减之前将日期转换为时间戳。减法的结果是一个 interval represented as "days hh24:mi:ss.fff". If necessary you can then use the 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;