2015-09-28 56 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