2013-07-16 28 views
4

你好iam是一個新手在SQL中,我需要你的幫助。CONVERT十進制DAYS到TIME格式

我有如下表:

start_date  |  end_date   
02.08.2012 09:27:19 | 06.08.2012 07:53:00 
06.08.2012 06:58:58 | 06.08.2012 13:42:33 
05.06.2012 14:35:58 | 05.06.2012 14:42:31 

我需要顯示起始日期日期和結束日期之間的時間間隔。

我做到了這樣的:END_DATE - 起始日期=持續時間
但它顯示一個十進制值(見下文表 - 字段持續時間)。

我需要字段持續時間來顯示像這樣:HH:MM:SS - 不是十進制。

start_date  |  end_date   |   duration  | I need it like this 
02.08.2012 09:27:19 | 06.08.2012 07:53:00 | --> 3.93450231481481 | 94:25:41 
06.08.2012 06:58:58 | 06.08.2012 13:42:33 | --> 0.280266203703704 | 06:43:35 
05.06.2012 14:35:58 | 05.06.2012 14:42:31 | --> 0.0045486111111... | 00:06:33 

如果有什麼不確定我會嘗試解釋。 我希望你能幫助我。祝你今天愉快。

+0

看一看:http://www.orafaq.com/faq/how_does_one_get_the_time_difference_between_two_date_columns –

回答

0

我認爲你需要使用內置的oracle函數。試試看這裏看到的日期SUB Oracle Docs/MySQL

這將允許您設置返回時間的精度。

+0

該鏈接是MySQL文檔。 –

+0

已更新的鏈接名稱,謝謝@AlexPoole – spartikus

+1

我想你可能是指[timediff](http://docs.oracle.com/cd/E17952_01/refman-5.1-zh/date-and-time-functions.html#function_timediff) ,但這些仍然是MySQL函數,並且不能與Oracle RDBMS一起使用。 –

2

減去日期會給你天數。您可以使用NumToDSInterval函數將它們變成INTERVAL DAY TO SECOND值。

開始日期02.08.2012 09:27:19和結束日期06.08.2012 07:53:00,結果是接近,但不太你想要什麼(請注意這裏41秒成爲40.9999999浮筒式四捨五入的事情...):

SQL> SELECT NumToDSInterval(
    2 TO_DATE('06.08.2012 07:53:00', 'DD.MM.YYYY HH24:MI:SS') - 
    3 TO_DATE('02.08.2012 09:27:19', 'DD.MM.YYYY HH24:MI:SS'), 'DAY') AS Elapsed 
    4 FROM DUAL; 

ELAPSED 
----------------------------- 
+000000003 22:25:40.999999999 

但這是一個很好的起點,因爲一旦經過時間在INTERVAL類型中,您可以EXTRACT天,小時,分鐘和秒。我會做這樣的事情:

WITH spans AS (
    SELECT NUMTODSINTERVAL(end_date - start_date, 'DAY') AS Elapsed 
    FROM myTable 
) 
SELECT 
    EXTRACT(DAY FROM Elapsed) * 24 + EXTRACT(HOUR FROM Elapsed) || ':' || 
    EXTRACT(MINUTE FROM Elapsed) || ':' || 
    ROUND(EXTRACT(SECOND FROM Elapsed), 0) AS duration 
FROM spans 

我想這與你第一套的日期和它的工作就好了;該ROUND作出秒出來正確的41


附錄 OP需要在一個視圖中使用這個邏輯,我敢肯定的CTE(公共表表達式,否則所知道的「以foo AS(查詢)「)不會飛行視圖。

在視圖中使用,移動CTE的子查詢來代替:

CREATE OR REPLACE VIEW myView AS 
    SELECT 
    EXTRACT(DAY FROM Elapsed) * 24 + EXTRACT(HOUR FROM Elapsed) || ':' || 
    EXTRACT(MINUTE FROM Elapsed) || ':' || 
    ROUND(EXTRACT(SECOND FROM Elapsed), 0) AS duration 
    FROM (
    SELECT NUMTODSINTERVAL(end_date - start_date, 'DAY') AS Elapsed 
    FROM myTable 
) 
+0

我這樣實現你的代碼,但它說ORA-00936:缺少表達式。選擇具有跨AS( SELECT END_DATE - 起始日期AS消逝 FROM my_date_table ) 選擇 提取物(日從消逝)* 24 + EXTRACT(一小時內,經過的)|| ':'|| EXTRACT(MINUTE FROM Elapsed)|| ':'|| ROUND(EXTRACT(從第二個經過),0)AS持續時間 FROM my_table; – user2588995

+0

@ user2588995 - Ed發佈了整個查詢;你不需要你已經環繞它的'select ... from my_table'。 'WITH'子句從你的表中選擇差異; 'SELECT'然後使用它來有效地格式化結果。您可以將「WITH」看作臨時視圖。 –

+0

謝謝你的回覆。我需要把它放在一個視圖中。我該怎麼做呢?它說失蹤的表達。我讀過,我不能在一個視圖中添加子句?我的觀點:創建或替換視圖的順序,從cust_order中選擇customer_id,name,start_date,end_date – user2588995

0

我注意到你想要小時超過一天。以下內容爲您提供了幾天,幾小時,幾分鐘,幾秒鐘,最多可以運行31天。我們的想法是將其轉換爲一個日期,然後使用to_char()的轉換:

select to_char(cast('01-Jan-2000' as date) + duration, 
       'dd hh:mm:ss') 

並不理想,但快。