用于比较字符串(HH24MI)与日期的 Sql 查询帮助

Posted

技术标签:

【中文标题】用于比较字符串(HH24MI)与日期的 Sql 查询帮助【英文标题】:Help with Sql query for comparing string(HH24MI) to date 【发布时间】:2011-08-02 15:12:54 【问题描述】:

我们有一个如下所示的配置表,其中存储了开始时间和持续时间。 如果开始时间是 9:20 pm(第三个)添加持续时间,则时间变为 9:35。 我必须找出当前时间是否在任何值之间。 我必须根据 start_time 和持续时间返回输出。即当前时间应该在 start_time 和 start_time + 持续时间之间。 (09:20 至 09:35 之间) 你能帮我处理一下sql查询吗?还是用sql函数更好?

Start_time, duration(minutes)   output

1108                 5            2

1054                100           5

2120                15            8

【问题讨论】:

【参考方案1】:

我不喜欢在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

【讨论】:

【参考方案2】:

以下选择 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;

【讨论】:

当我运行查询时,我得到的 start_date 和 end_date 都是一样的。 您想查看日期...已编辑以显示 start_date 和 end_date

以上是关于用于比较字符串(HH24MI)与日期的 Sql 查询帮助的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql日期比较

SQL 如何从日期中提取时间到 HH:MI:SS PM/AM?

如何将存储为 VARCHAR2 的日期转换为 'MM/DD/YYYY HH24:MI:SS'?

将存储为 hh24miss 的时间转换为 hh24:mi:ss

sql常用格式化函数及字符串函数

日期转换函数