在 Oracle 中解码和转换 VARCHAR 时间

Decoding and Converting VARCHAR Time in Oracle

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

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

像这样?

在您的输出中,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

如果您这样做 to_date(col_1, 'HH24:MI'),您将在该月的第一天获得领带,因为 Oracle 默认为没有指定日期。然后您可以 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