我写一些ETL获取数据了传统的Oracle数据库,并纳入分析服务等SQL Server数据库Oracle数字为TIME
遗留的Oracle数据库存储若干时间的列数(4,2) 。
9 = 09:00
1.2 = 01:20
11.53 = 11:53
是否有任何内置的函数将它转换为时间数据类型?有没有人遇到过这个?你是如何解决它的?
感谢
我写一些ETL获取数据了传统的Oracle数据库,并纳入分析服务等SQL Server数据库Oracle数字为TIME
遗留的Oracle数据库存储若干时间的列数(4,2) 。
9 = 09:00
1.2 = 01:20
11.53 = 11:53
是否有任何内置的函数将它转换为时间数据类型?有没有人遇到过这个?你是如何解决它的?
感谢
Oracle没有一个TIME
数据类型 - 它有DATE
或TIMESTAMP
这两者有一个日期和时间部分。
的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')
| 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')
| 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
| 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 |
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
什么28.78? –
我不认为'NUMERIC'会存储'11:53'。 –
Oracle没有'TIME'数据类型 - 它具有'DATE'或'TIMESTAMP',它们都有日期和时间组件。 – MT0