在Oracle中解码和转换VARCHAR时间

时间:2016-09-23 17:09:09

标签: oracle time decode varchar

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

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的新手,还在学习。 :)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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