2016-09-26 32 views
-1

我在我的数据库中有一个表,它有两列,一个是START_TIME,另一个是END_TIME。这些列的类型为VARCHAR2SQL Select VARCHAR列类型之间的时间差

我想选择这两列之间的时间差。

只是想知道这些列包含什么样的数据我已经从下面的这些列中选择了数据。

这是SELECT DISTINCT start_time FROM table_name结果:

15:20 
22.30 
16:00 
24:00 
07:00 
06:55 
6:45 
23:50 
6.5 
15.20 
19:00 
0:00 
1600 
16 
19 
15:00 
6:50 
7 
15:30 
23.50 
24 
14.75 
23 
15:45 
00:15 

,这是SELECT DISTINCT end_time FROM table_name结果

07:00 
16:00 
24:00 
6:45 
15:35 
07 
00 
16 
08:00 
07:20 
7.25 
15:00 
0700 
7 
15:30 
15 
06:45 
07.00 
24 
15.30 
7:00 
23 
15:45 
00:15 

可以做些什么?

+1

现在没有足够的信息来匹配start_time和end_time。来自同一张表的这两列(看起来像是这样,但很确定)? – Linkan

+1

Yuk。你需要解决什么是写入表中。你需要重新格式化这些值,以便它们可以被解析为一个时间,单个数字应该如何解释 - 什么是“7”和“6.5”? –

+0

同时向我们显示两列的样品表数据。并显示使用预期的结果。 – jarlh

回答

-1
select to_date(start_time,'hh24:mi')-to_date(end_time,'hh24:mi') FROM table_name; 
+0

这可能只适用于日期格式为hh24:mi – Aleksej

+0

虽然此链接可能回答问题,但最好是包括答案的基本部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/13797624) –

+2

@ H.Pauwelynツ:我相信这个答案的问题不同于包含作为链接的答案 – Aleksej

1

您的数据看起来像它包含了各种格式小时。 “14.75”表示小数点是十进制小时。

我建议将所有转换为十进制小时。所以,这样的事情:

select (case when col like '%:%' 
      then cast(regexp_substr(col, '[^:]', 1, 1) as decimal(10, 2)) + cast(right(col, 2) as decimal(10, 2))/100 
      else cast(col as decimal(10, 2)) 
     end) 

然后,您可以将两者并采取差别得到的时间差 - 你会得到十进制小时。

+0

我试过这个: 'select(case start_time like'%:%' then extract(from start_time hour)+ extract(minute from start_time)/ 60.0 else cast(start_time as decimal(10,2)) end )as cr from pmcaldt' 我得到这个错误: 'ORA-30076:提取源的无效提取字段' 我做错了吗? –

+0

@FarzadSoltani。 。 。我以某种方式迷惑自己。该列是一个字符串,所以它需要字符串函数,而不是日期/时间函数。 –