如果你这样做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
。
谢谢,它应该像00:00 = 00:00 - 01:00一样,尽管交易时间只是从06:00到20:00,所以可以忽略,因为之后没有数据。 –
@paulsinohin - 进一步思考,我简化了一下。 – mathguy