帮助Sql查询比较字符串(HH24MI)到日期

时间:2011-08-02 15:12:54

标签: sql oracle

我们有一个如下所示的配置表,用于存储开始时间和持续时间。 如果开始时间是晚上9:20(第3个),则添加持续时间,然后时间变为9:35。 我必须找出当前时间是否介于任何值之间。 我必须根据start_time和duration返回输出。即当前时间应该在start_time和start_time + duration之间。 (09:20至09:35之间) 你能帮我解决一下sql查询吗?或者如果我们使用sql函数会更好吗?

Start_time, duration(minutes)   output

1108                 5            2

1054                100           5

2120                15            8

2 个答案:

答案 0 :(得分:4)

我不喜欢在VARCHAR2列中存储日期和时间。 START_TIME应该是DATETIMESTAMP列。

那就是说,你可以做点什么

 with x as (
   select '1108' start_time, 5 duration, 2 output from dual
   union all
   select '1054', 100, 5 from dual
   union all
   select '2120', 15, 8 from dual
 )
 select *
   from (
     select to_date(
               to_char(sysdate,'YYYY-MM-DD') || ' ' ||
                 start_time,
               'YYYY-MM-DD HH24MI' ) start_date,
            to_date(
               to_char(sysdate,'YYYY-MM-DD') || ' ' ||
                 start_time,
               'YYYY-MM-DD HH24MI' ) + duration/24/60 end_date
   from x)
  where sysdate between start_date and end_date

答案 1 :(得分:1)

以下选择sysdate在Start_Time和Start_Time + duration内的所有行(根据OP的注释编辑):

SELECT (TRUNC ( SYSDATE ) + TO_NUMBER ( SUBSTR ( Start_Time, 0, 2 ) ) / 24.0 + TO_NUMBER ( SUBSTR ( Start_Time, 3 ) ) / (24.0 * 60.0))  start_date, (TRUNC ( SYSDATE ) + TO_NUMBER ( SUBSTR ( Start_Time, 0, 2 ) ) / 24.0 + TO_NUMBER ( SUBSTR ( Start_Time, 3 ) ) / (24.0 * 60.0) + TO_NUMBER (duration))  end_date FROM configtable;