2015-09-28 26 views
2

我寫一些ETL獲取數據了傳統的Oracle數據庫,並納入分析服務等SQL Server數據庫Oracle數字爲TIME

遺留的Oracle數據庫存儲若干時間的列數(4,2) 。

9 = 09:00 
1.2 = 01:20 
11.53 = 11:53 

是否有任何內置的函數將它轉換爲時間數據類型?有沒有人遇到過這個?你是如何解決它的?

感謝

+1

什麼28.78? –

+3

我不認爲'NUMERIC'會存儲'11:53'。 –

+0

Oracle沒有'TIME'數據類型 - 它具有'DATE'或'TIMESTAMP',它們都有日期和時間組件。 – MT0

回答

1

Oracle沒有一個TIME數據類型 - 它有DATETIMESTAMP這兩者有一個日期和時間部分。

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE times (time) AS 
      SELECT 9 FROM DUAL 
UNION ALL SELECT 1.2 FROM DUAL 
UNION ALL SELECT 15.53 FROM DUAL 
UNION ALL SELECT 24.62 FROM DUAL; 

查詢1 - 獲取正確的時間成分對作爲數字有效時間

SELECT time, 
     TO_DATE(TO_CHAR(time, '00.00'), 'HH24.MI') AS parsed_time 
FROM times 
WHERE REGEXP_LIKE(TO_CHAR(time, '00.00'), '([01]\d|2[0-3]).[0-5]\d') 

Results

| TIME |     PARSED_TIME | 
|-------|-----------------------------| 
|  9 | September, 01 2015 09:00:00 | 
| 1.2 | September, 01 2015 01:20:00 | 
| 15.53 | September, 01 2015 15:53:00 | 

查詢2 - 獲取正確的時間組件,用於這與今天的日期有效時間數字:

SELECT time, 
     TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD') || ' ' || TO_CHAR(time, '00.00'), 'YYYY-MM-DD HH24.MI') AS parsed_time 
FROM times 
WHERE REGEXP_LIKE(TO_CHAR(time, '00.00'), '([01]\d|2[0-3]).[0-5]\d') 

Results

| TIME |     PARSED_TIME | 
|-------|-----------------------------| 
|  9 | September, 28 2015 09:00:00 | 
| 1.2 | September, 28 2015 01:20:00 | 
| 15.53 | September, 28 2015 15:53:00 | 

查詢3 - 獲取任意數小時的正確時間分量(單位部分)和分鐘(小數部分)

SELECT time, 
     TRUNC(SYSDATE) + TRUNC(time)/24 + (time - TRUNC(time)) * 100/60/ 24 AS parsed_time 
FROM times 

Results

| TIME |     PARSED_TIME | 
|-------|-----------------------------| 
|  9 | September, 28 2015 09:00:00 | 
| 1.2 | September, 28 2015 01:20:00 | 
| 15.53 | September, 28 2015 15:53:00 | 
| 24.62 | September, 29 2015 01:02:00 | 
0

EDIT2:更正查詢按MT0。當你在EDIT1之間,而不是.

 with tbl as(
     select 9 as tf from dual union all 
     select 1.2 from dual union all 
     select 11.53 as tf from dual 
     ) 
     select TO_DATE(TO_CHAR(replace(to_char(tf),':','.'), '00.00'), 'HH24.MI') AS time from tbl 

:這也將照顧情景:它只會爲你給的值工作。如果你有一些東西,是不是有效的時間,那麼它將無法說

ORA-01850: hour must be between 0 and 23 
or 
ORA-01851: minutes must be between 0 and 59 
+0

對於'1.2',它將返回'01:02'而不是'01:20'。 – MT0

+0

是的,我現在看到它。接得好。你的查詢似乎克服了這一點。謝謝。 – Utsav

+0

@ MT0糾正它。這也會照顧':'在兩者之間。感謝您的查詢。 – Utsav