2017-10-15 128 views
2

我有一個要求,一天24小時在表「time_hours」中存儲。這裏是我的表的結構:自動填充「time_hour」表

Create table time_hours 
    (HOURS number, 
    HOUR_RANGE VARCHAR (20), 
    HOUR_MIN VARCHAR (20), 
    HOUR_MAX VARCHAR(20)); 

這裏是劇本我到目前爲止有:

Insert into time_hours(HOURS, 
    HOUR_RANGE, 
    HOUR_MIN, 
    HOUR_MAX) 
Select 
to_number(to_char(t,'HH24'),'00'), 
to_char(t,'HH24:MI:SS'), 
to_char(t,'HH24:MI:SS'), 
to_char(t,'HH24:MI:SS') 
FROM 
    (
    Select trunc(sysdate) + (level-1)/24 as t 
    FROM dual 
    Connect by level <=24 
    ); 

結果是:

Hours | HOUR_RANGE | HOUR_MIN | HOUR_MAX 
0  00:00:00 00:00:00 00:00:00 
1  01:00:00  01:00:00 01:00:00  
..  
23  23:00:00  23:00:00 23:00:00 

不過,我需要這樣的輸出:

Hours | HOUR_RANGE | HOUR_MIN | HOUR_MAX 
0  00h-00h59 00:00:00 00:59:59 
1  01h00-01h59 01:00:00 01:59:59 
2  02h00-02h59 02:00:00 02:59:59 
..  ..   ..   .. 
23  23h00-23h59 23:00:00 23.59.59 

我的問題: 如何格式化「HOUR_RANGE」和「HOUR_MAX」列以提供預期輸出?

謝謝大家提前對你的幫助

+0

您應該考慮使用Oracle INTERVAL DAY TO SECOND數據類型。你的應用程序會有更少的麻煩。 –

回答

0

畢竟,這是一個包含了小時加只是字符串一些其他字符。根本不需要轉換日期。

insert into time_hours(hours, hour_range, hour_min, hour_max) 
select 
    level-1 as hours, 
    to_char(level-1, '00') || 'h00-' || to_char(level-1, '00') || 'h59' as hour_range, 
    to_char(level-1, '00') || ':00:00'as hour_min, 
    to_char(level-1, '00') || ':59:59'as hour_max 
from dual connect by level <= 24; 
+0

嗨Thorsten,是的,你是對的,沒有日期轉換需要,只需幾小時+其他字符,謝謝堆! – Esperanza

2

你可以使用:

Select 
    to_number(to_char(t,'HH24'),'00') AS Hours, 
    to_char(t,'HH24"h"MI"-"HH24"h59"') AS HOUR_RANGE, 
    to_char(t,'HH24:MI:SS') AS HOUR_MIN, 
    to_char(t+1/24-1/(24*3600),'HH24:MI:SS') AS HOUR_MAX 
FROM (Select trunc(sysdate) + (level-1)/24 as t 
    FROM dual 
    Connect by level <=24); 

Rextester Demo

0

我想你可以使用下面的代碼。

您可以使用管道連接字符。

您可以使用一些算術運算來獲得給定小時的最大分鐘數和秒數; 1/24 * 60 = 1/1440添加一分鐘到日期值。 1/24 * 60 * 60 = 1/86400爲日期值添加秒。

INSERT INTO time_hours (HOURS, HOUR_RANGE, HOUR_MIN, HOUR_MAX) 
    SELECT 
    to_number(to_char(t, 'HH24'), '00'), 
    to_char(t, 'HH24') || 'h' || to_char(t, 'MI') || '-' || to_char(t, 'HH24') || 'h59', 
    to_char(t, 'HH24:MI:SS'), 
    to_char(t + 1/86400*59 + 1/1440*59, 'HH24:MI:SS') 
    FROM (SELECT trunc(SYSDATE) + (LEVEL - 1)/24 AS t 
     FROM dual 
     CONNECT BY LEVEL <= 24); 

Query Result