2015-09-28 3 views
2

Im писать некоторые ETL, чтобы получить данные из прежних версий Oracle БД и в БД SQL Server для анализа услуг и т.д.Oracle NUMBER для TIME

База оракул наследие хранит несколько колонок время как номер (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 тип данных - это имеет DATE или TIMESTAMP оба из которых имеют дату и временную составляющую.

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. Это будет также заботиться о сценарии, когда у вас есть : между вместо .

 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 

EDIT1: Это будет работать только для значений, которые вы дали. Если у вас есть то, что является не допустимым временем, то это не получится говоря

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

Смежные вопросы