2016-09-23 37 views
0

我需要查询数据库中的特定列w/c描述为VARCHAR,我需要将其转换为时间格式(HH:MM)然后解码为其范围值,以进一步解释...当(时间)特定交易在当天进行时,该列存储数据,而不是返回应该返回其完成时间范围的确切时间。解码和转换Oracle中的VARCHAR时间

Col_1 is VARCHAR2(6) 

select col_2, col_1 from table 

Col_2 || Col_1 

A  || 9:56 

B  || 10:03 

C  || 21:53 

我所需的输出是

Col_2 || Col_1 

A  || (09:00 - 10:00) 

B  || (10:00 - 11:00) 

C  || (2100 - 2200) 

真的很感激您的意见,因为我被困现在这部分打了几天和它给我的恶梦,对不起,我DB Oracle SQL的新东西,仍然在学习。 :)

回答

1

是否这样?

在你的输出中,2100 - 2200与其余的不一致;我忽略了它。

甚至当输入像10:00一样时会发生什么?这是在9:00-10:00和10:00-11:00;我以为你想要后者。

最后,是00:00好吗,或者你想让它成为24:00(如果它在最后) - 请参阅我的输出中的第二个示例。

with input_strings (str) as (
    select '9:49' from dual union all 
    select '23:00' from dual 
), 
prep (dt) as (
    select trunc(to_date(str, 'hh24:mi'),'hh') from input_strings 
) 
select to_char(dt, 'hh24:mi') || ' - ' || to_char(dt + 1/24, 'hh24:mi') as range 
from prep; 

RANGE  
------------- 
09:00 - 10:00 
23:00 - 00:00 
+0

谢谢,它应该像00:00 = 00:00 - 01:00一样,尽管交易时间只是从06:00到20:00,所以可以忽略,因为之后没有数据。 –

+0

@paulsinohin - 进一步思考,我简化了一下。 – mathguy

0

如果你这样做to_date(col_1, 'HH24:MI')你会得到在每月的第一天领带,作为甲骨文默认为不指定的日期。然后,您可以truncate是到小时,零分钟:

with t (col_2, col_1) as (
    select 'A', '9:56' from dual 
    union all select 'B', '10:03' from dual 
    union all select 'C', '21:53' from dual 
) 
select col_2, 
    to_char(to_date(col_1, 'HH24:MI'), 'YYYY-MM-DD HH24:MI') as full_date, 
    to_char(trunc(to_date(col_1, 'HH24:MI'), 'HH24'), 'YYYY-MM-DD HH24:MI') as truncated 
from t; 

C FULL_DATE  TRUNCATED  
- ---------------- ---------------- 
A 2016-09-01 09:56 2016-09-01 09:00 
B 2016-09-01 10:03 2016-09-01 10:00 
C 2016-09-01 21:53 2016-09-01 21:00 

,将给你下你的范围的约束。您可以在一小时增加了计算的日期,以获得上限,然后都转换回字符串,并一起将它们连接起来:

with t (col_2, col_1) as (
    select 'A', '9:56' from dual 
    union all select 'B', '10:03' from dual 
    union all select 'C', '21:53' from dual 
) 
select col_2, 
    to_char(trunc(to_date(col_1, 'HH24:MI'), 'HH24'), 'HH24:MI') ||' - '|| 
    to_char(trunc(to_date(col_1, 'HH24:MI') + 1/24, 'HH24'), 'HH24:MI') 
from t; 

C TO_CHAR(TRUNC 
- ------------- 
A 09:00 - 10:00 
B 10:00 - 11:00 
C 21:00 - 22:00 

你也可以尝试从一个字符串中提取小时值和操纵该,但是您必须手动处理23:00至00:00之间的时间。

第三种选择是使用区间,而不是一个日期:

to_char(extract(hour from to_dsinterval('0 ' || col_1 || ':00')), 'FM00') ||':00 - '|| 
    to_char(extract(hour from to_dsinterval('0 ' || col_1 || ':00')) + 1, 'FM00') ||':00' 

但同样,这将显示的时间发言权23:15为23:00 - 24:00,所以你需要额外的处理,显示上在那种情况下绑定为00:00

+0

谢谢!这是我一直在寻找我的报告是我期待有..干杯伴侣! –