我需要查询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的新手,还在学习。 :)
答案 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
。