【发布时间】:2012-06-15 18:19:50
【问题描述】:
我需要从给定的总秒数值中以 Hours:Minutes:Seconds 格式显示用户可用时间。感谢您是否知道 ORACLE 函数可以执行相同操作。我正在使用 Oracle。
感谢您的宝贵时间。
【问题讨论】:
标签: sql oracle plsql plsqldeveloper
我需要从给定的总秒数值中以 Hours:Minutes:Seconds 格式显示用户可用时间。感谢您是否知道 ORACLE 函数可以执行相同操作。我正在使用 Oracle。
感谢您的宝贵时间。
【问题讨论】:
标签: sql oracle plsql plsqldeveloper
【讨论】:
如果你有一个包含 f.e. 的变量。 1 分钟(以秒为单位),您可以将其添加到 systimestamp 中,然后使用 to_char 从中选择不同的时间部分。
select to_char(systimestamp+60/(24*60*60), 'yyyy.mm.dd HH24:mi:ss') from dual
【讨论】:
很遗憾,没有……但是,如果要少于 24 小时,有一个简单的技巧。
Oracle 假定添加到日期的数字以天为单位。将秒数转换为天数。添加当前日期,然后使用to_date 函数仅获取您感兴趣的部分。假设您有x 秒:
select to_char(sysdate + (x / ( 60 * 60 * 24 ) ), 'HH24:MI:SS')
from dual
如果超过 24 小时,这将不起作用,但您可以再次删除当前数据并获取天、小时、分钟和秒的差异。
如果您想要类似:51:10:05,即 51 小时 10 分 5 秒,那么您将不得不使用 trunc。
再次假设您有x 秒...
trunc(x / 60 / 60)
trunc((x - ( trunc(x / 60 / 60) * 60 * 60 )) / 60)
x - hours * 60 * 60 - minutes * 60
留给你:
with hrs as (
select x, trunc(x / 60 / 60) as h
from dual
)
, mins as (
select x, h, trunc((x - h * 60 * 60) / 60) as m
from hrs
)
select h, m, x - (h * 60 * 60) - (m * 60)
from mins
我已经设置了SQL Fiddle 来演示。
【讨论】:
sysdate + interval '1' second
trunc(sysdate) + (x / (60 * 60 * 24))?
如果您只是想将给定的秒数转换为 HH:MI:SS 格式,应该这样做
SELECT
TO_CHAR(TRUNC(x/3600),'FM9900') || ':' ||
TO_CHAR(TRUNC(MOD(x,3600)/60),'FM00') || ':' ||
TO_CHAR(MOD(x,60),'FM00')
FROM DUAL
其中x 是秒数。
【讨论】:
以下是另一种方式 (tm) - 仍然涉及一些计算,但提供了一个使用 EXTRACT 将各个字段拉出 INTERVAL 的示例:
DECLARE
SUBTYPE BIG_INTERVAL IS INTERVAL DAY(9) TO SECOND;
i BIG_INTERVAL;
nSeconds NUMBER := 86400000;
FUNCTION INTERVAL_TO_HMS_STRING(inv IN BIG_INTERVAL)
RETURN VARCHAR2
IS
nHours NUMBER;
nMinutes NUMBER;
nSeconds NUMBER;
strHour_format VARCHAR2(10) := '09';
workInv INTERVAL DAY(9) TO SECOND(9);
BEGIN
nHours := EXTRACT(HOUR FROM inv) + (EXTRACT(DAY FROM inv) * 24);
strHour_format := TRIM(RPAD(' ', LENGTH(TRIM(TO_CHAR(ABS(nHours)))), '0') || '9');
nMinutes := ABS(EXTRACT(MINUTE FROM inv));
nSeconds := ABS(EXTRACT(SECOND FROM inv));
RETURN TRIM(TO_CHAR(nHours, strHour_format)) || ':' ||
TRIM(TO_CHAR(nMInutes, '09')) || ':' ||
TRIM(TO_CHAR(nSeconds, '09'));
END INTERVAL_TO_HMS_STRING;
BEGIN
i := NUMTODSINTERVAL(nSeconds, 'SECOND');
DBMS_OUTPUT.PUT_LINE('i (fields) = ' || INTERVAL_TO_HMS_STRING(i));
END;
提取字段等的代码仍然必须包含将 DAY 字段转换为等效小时数的计算,这不是最漂亮的,但巧妙地包含在一个使用起来还不错的过程中。
分享和享受。
【讨论】:
试试这个。 非常简单易用
select to_char(to_date(10000,'sssss'),'hh24:mi:ss') from dual;
【讨论】:
create or replace function `seconds_hh_mi_ss` (seconds in number)
return varchar2
is
hours_var number;
minutes_var number;
seconds_var number;
remeinder_var number;
output_var varchar2(32);
begin
select seconds - mod(seconds,3600) into hours_var from dual;
select seconds - hours_var into remeinder_var from dual;
select (remeinder_var - mod(remeinder_var,60)) into minutes_var from dual;
select seconds - (hours_var+minutes_var) into seconds_var from dual;
output_var := hours_var/3600||':'||minutes_var/60||':'||seconds_var;
return(output_var);
end;
/
【讨论】:
假设您的时间在下面称为 st.etime 并以秒为单位存储,这就是我使用的。这会处理秒数大于 86399 秒(即晚上 11:59:59)的时间
当 st.etime > 86399 然后 to_char(to_date(st.etime - 86400,'sssss'),'HH24:MI:SS') else to_char(to_date(st.etime,'sssss'),'HH24 :MI:SS') 结束 readable_time
【讨论】:
对于 vogash 对答案的评论,我知道您想要一个计时器之类的东西,那是因为您可以有超过 24 小时。为此,您可以执行以下操作:
select to_char(trunc(xxx/3600)) || to_char(to_date(mod(xxx, 86400),'sssss'),':mi:ss') as time
from dual;
xxx 是您的秒数。
第一部分累积小时,第二部分计算剩余的分钟和秒。例如,拥有150023 seconds,它会给你41:40:23。
但如果你总是想拥有 hh24:mi:ss,即使你有超过 86000 seconds(1 天),你也可以这样做:
select to_char(to_date(mod(xxx, 86400),'sssss'),'hh24:mi:ss') as time
from dual;
xxx 是您的秒数。
例如,拥有86402 seconds,它会将时间重置为00:00:02。
【讨论】:
以下代码不太复杂,并且给出了相同的结果。请注意,“X”是要转换为小时的秒数。
在 Oracle 中使用:
SELECT TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (X, 'second'),
'hh24:mi:ss'
) hr
FROM DUAL;
在 SqlServer 中使用:
SELECT CONVERT(varchar, DATEADD(s, X, 0), 108);
【讨论】:
我的版本。以 DDd HHh MMm SSs 格式显示 Oracle DB 正常运行时间
select to_char(trunc((((86400*x)/60)/60)/24)) || 'd ' ||
to_char(trunc(((86400*x)/60)/60)-24*(trunc((((86400*x)/60)/60)/24)), 'FM00') || 'h ' ||
to_char(trunc((86400*x)/60)-60*(trunc(((86400*x)/60)/60)), 'FM00') || 'm ' ||
to_char(trunc(86400*x)-60*(trunc((86400*x)/60)), 'FM00') || 's' "UPTIME"
from (select (sysdate - t.startup_time) x from V$INSTANCE t);
【讨论】:
将分钟转换为小时:分钟:秒格式
SELECT
TO_CHAR(TRUNC((MINUTES * 60) / 3600), 'FM9900') || ':' ||
TO_CHAR(TRUNC(MOD((MINUTES * 60), 3600) / 60), 'FM00') || ':' ||
TO_CHAR(MOD((MINUTES * 60), 60), 'FM00') AS MIN_TO_HOUR FROM DUAL
【讨论】:
对于超过 24 小时,您可以在以下查询中包含天数。返回格式为days:hh24:mi:ss
查询:select trunc(trunc(sysdate) + numtodsinterval(9999999, 'second')) - trunc(sysdate) || ':' || to_char(trunc(sysdate) + numtodsinterval(9999999, 'second'), 'hh24:mi:ss') from dual;
输出:115:17:46:39
【讨论】:
create or replace procedure mili(num in number)
as
yr number;
yrsms number;
mon number;
monsms number;
wk number;
wksms number;
dy number;
dysms number;
hr number;
hrsms number;
mn number;
mnsms number;
sec number;
begin
yr := FLOOR(num/31556952000);
yrsms := mod(num, 31556952000);
mon := FLOOR(yrsms/2629746000);
monsms := mod(num,2629746000);
wk := FLOOR(monsms/(604800000));
wksms := mod(num,604800000);
dy := floor(wksms/ (24*60*60*1000));
dysms :=mod(num,24*60*60*1000);
hr := floor((dysms)/(60*60*1000));
hrsms := mod(num,60*60*1000);
mn := floor((hrsms)/(60*1000));
mnsms := mod(num,60*1000);
sec := floor((mnsms)/(1000));
dbms_output.put_line(' Year:'||yr||' Month:'||mon||' Week:'||wk||' Day:'||dy||' Hour:'||hr||' Min:'||mn||' Sec: '||sec);
end;
/
begin
mili(12345678904234);
end;
【讨论】: