2012-06-12 71 views
11

Tôi có yêu cầu hiển thị thời gian có sẵn của người dùng theo giờ: Phút: Định dạng giây từ tổng số giá trị giây đã cho. Đánh giá cao nếu bạn biết một hàm ORACLE để thực hiện tương tự. Tôi đang sử dụng Oracle.Oracle chuyển đổi giây sang giờ: phút: giây

Cảm ơn bạn đã dành thời gian.

Trả lời

20

Nếu bạn chỉ tìm cách để chuyển đổi một số lượng nhất định của giây vào HH: MI: SS, điều này sẽ làm điều đó

SELECT 
    TO_CHAR(TRUNC(x/3600),'FM9900') || ':' || 
    TO_CHAR(TRUNC(MOD(x,3600)/60),'FM00') || ':' || 
    TO_CHAR(MOD(x,60),'FM00') 
FROM DUAL 

nơi x là số giây.

+0

Điều này hoạt động tốt. Nhưng nếu giờ> 99 giờ thì nó không hoạt động chính xác – user1430989

+0

Xem bản chỉnh sửa của tôi bằng TO_CHAR thay vì LPAD. Nó sẽ xử lý lên đến 9999 giờ ngay bây giờ. Nếu bạn cần nhiều hơn thế, bạn có thể thêm số 9 vào chuỗi định dạng trong hàm TO_CHAR đầu tiên. – Mike

+0

Đây không phải là chính xác cho trường hợp dưới đây: SELECT TO_CHAR (TRUNC (76014000/3600), 'FM999999900') || 'Hrs' || TO_CHAR (TRUNC (MOD (76014000,3600)/60), 'FM00') || 'Min' TỪ DUAL; –

-2

Bạn nên xem this site. Phần TO_TIMESTAMP có thể hữu ích cho bạn!

Cú pháp:

TO_TIMESTAMP (string , [ format_mask ] [ 'nlsparam' ] )

1

Nếu bạn có một biến chứa f.e. 1 phút (tính bằng giây), bạn có thể thêm nó vào systimestamp sau đó sử dụng to_char để chọn các phần thời gian khác nhau từ nó.

select to_char(systimestamp+60/(24*60*60), 'yyyy.mm.dd HH24:mi:ss') from dual 
+0

Tôi cố gắng này.Điều này không hiệu quả. bởi vì, hãy suy nghĩ về giây dài hơn 86400 giây (hơn 24 giờ, một ngày). Ví dụ: 86410 giây, tức là 1 ngày 10 giây, tương đương với: 24:00:10 theo định dạng hh: mm: ss .. Nhưng, như trên, nó chỉ cung cấp cho bạn: 00:00:10 giá trị, là sai ... – user1430989

+0

Tôi đã thử một cái gì đó như thế này .. CHỌN TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (82400, 'giây'), 'hh24: mi: ss' ) hr TỪ DUAL; – user1430989

+0

Giải pháp của tôi thực tế hoạt động. Bạn đang nhận được 00:00:10 vì bạn sử dụng "TRUNC (SYSDATE)". Thay thế "TRUNC (SYSDATE)" bằng "systimestamp" và thử lại. –

1

Thật không may là ... Tuy nhiên, có một mẹo đơn giản nếu nó sẽ ít hơn 24 giờ.

Oracle giả định rằng một số được thêm vào một ngày là theo ngày. Chuyển đổi số giây thành ngày. Thêm ngày hiện tại, sau đó sử dụng to_date chức năng để lấy chỉ những phần quan tâm của bạn trong Giả sử bạn có x giây:.

select to_char(sysdate + (x/(60 * 60 * 24)), 'HH24:MI:SS') 
    from dual 

này sẽ không hoạt động nếu có nhiều hơn 24 tiếng đồng hồ, mặc dù bạn có thể loại bỏ các hiện dữ liệu một lần nữa và nhận được sự khác biệt trong ngày, giờ, phút và giây.

Nếu bạn muốn một cái gì đó như: 51:10:05, tức là 51 giờ, 10 phút và 5 giây thì bạn sẽ phải sử dụng trunc.

Một lần nữa giả định rằng bạn có x giây ...

  • Số giờ là trunc(x/60/60)
  • Số phút là trunc((x - (trunc(x/60/60) * 60 * 60))/60)
  • Số giây do đó là x - hours * 60 * 60 - minutes * 60

Rời khỏi bạn với:

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 

Tôi đã thiết lập SQL Fiddle để minh họa.

+0

Việc thêm một giây trở nên dễ dàng hơn nhiều: 'sysdate + interval '1' second' –

+0

@a_horse_with_no_name, đủ công bằng, nó thực sự dài hơn và không giải quyết được điểm thứ hai nhưng lại sạch hơn! – Ben

+0

Có lẽ bạn có nghĩa là 'trunc (sysdate) + (x/(60 * 60 * 24))' trong đoạn đầu tiên ở trên? –

1

Sau đây là Yet Another Way (tm) - vẫn còn liên quan đến một tính toán nhỏ nhưng cung cấp một ví dụ của việc sử dụng TRÍCH để kéo các lĩnh vực cá nhân ra khỏi một 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; 

Mã được chiết xuất các lĩnh vực, vv, vẫn phải có một phép tính để chuyển đổi trường NGÀY thành giờ tương đương, và không phải là đẹp nhất, nhưng được gói gọn trong một quy trình không quá tệ để sử dụng.

Chia sẻ và thưởng thức.

25

Hãy thử cái này. Rất đơn giản và dễ sử dụng

select to_char(to_date(10000,'sssss'),'hh24:mi:ss') from dual; 
+10

Tôi thích điều này tốt hơn câu trả lời của tôi, nhưng nó không hoạt động trong hơn 86399 giây (1 ngày). – Mike

-1
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; 
/
0

Giả sử thời gian của bạn được gọi là st.etime dưới đây và được lưu trữ trong vài giây, đây là những gì tôi sử dụng. Điều này xử lý thời gian mà các giây lớn hơn 86399 giây (tức là 11:59:59 chiều)

trường hợp khi st.etime> 86399 sau đó to_char (to_date (st.etime - 86400, 'sssss'), 'HH24 : MI: SS ') khác to_char (to_date (st.etime,' sssss '),' HH24: MI: SS ') end readable_time

0

Đối với nhận xét về câu trả lời của vogash, tôi hiểu rằng bạn muốn một cái gì đó như bộ đếm thời gian, đó là vì bạn có thể có hơn 24 giờ. Đối với điều này, bạn có thể làm như sau:

select to_char(trunc(xxx/3600)) || to_char(to_date(mod(xxx, 86400),'sssss'),':mi:ss') as time 
from dual; 

xxx là số giây của bạn.

Phần đầu tiên tích lũy giờ và phần thứ hai tính số phút và giây còn lại. Ví dụ: có 150023 seconds nó sẽ cung cấp cho bạn 41:40:23.

Nhưng nếu bạn luôn muốn có hh24: mi: ss thậm chí nếu bạn có nhiều hơn 86000 seconds (1 ngày), bạn có thể làm:

select to_char(to_date(mod(xxx, 86400),'sssss'),'hh24:mi:ss') as time 
from dual; 

xxx là số điện thoại của giây.

Ví dụ: có 86402 seconds, thiết bị sẽ đặt lại thời gian thành 00:00:02.

3

Mã sau đây ít phức tạp hơn và cho kết quả tương tự. Lưu ý rằng 'X' là số giây được chuyển đổi thành giờ.

Trong Oracle sử dụng:

SELECT TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (X, 'second'), 
       'hh24:mi:ss' 
       ) hr 
    FROM DUAL; 

Trong sử dụng SQLServer:

SELECT CONVERT(varchar, DATEADD(s, X, 0), 108); 
+1

Lưu ý rằng điều này chỉ hoạt động nếu ít hơn 24 giờ – Jared

0

phiên bản của tôi. Hiện Oracle DB thời gian hoạt động ở định dạng DDD HHH mmm SS

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); 

ý tưởng từ Date/Time Arithmetic with Oracle 9/10

0

Chuyển đổi phút để giờ: phút: định dạng giây

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 
0

Đối với hơn 24 tiếng đồng hồ bạn có thể bao gồm ngày với truy vấn sau. Định dạng lại là days:hh24:mi:ss

Query:
select trunc(trunc(sysdate) + numtodsinterval(9999999, 'second')) - trunc(sysdate) || ':' || to_char(trunc(sysdate) + numtodsinterval(9999999, 'second'), 'hh24:mi:ss') from dual;

Output:
115:17:46:39

0
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; 
Các vấn đề liên quan