代码之家  ›  专栏  ›  技术社区  ›  SilverNak jach

在最后一分钟内选择行

  •  0
  • SilverNak jach  · 技术社区  · 7 年前

    我想在数据库中找到最后一分钟内有时间戳的行。

    例如:

    当12:02:43-->从12:01:00到12:01:59(包括12:01:59)时
    14:01:00-->14:00:00至14:00:59(含)时
    当16:24:59-->从16:23:00到16:23:59(含)时

    我找到了下面的陈述。

    select *
    from table
    where time < to_date(to_char(sysdate, 'DD.MM.YYYY HH24:MI'), 'DD.MM.YYYY HH24:MI') 
      and time >= to_date(to_char(sysdate - numtodsinterval(1, 'Minute'), 'DD.MM.YYYY HH24:MI'), 'DD.MM.YYYY HH24:MI')
    

    语句可以工作,但是将日期转换为字符串,然后再转换回日期似乎有点奇怪。有没有其他方法只使用分钟作为精度(不使用秒)?

    可以使用特定于Oracle的函数,但我更喜欢标准的SQL方式。

    3 回复  |  直到 7 年前
        1
  •  1
  •   wolφi    7 年前

    你说得对,把它转换成字符串似乎没必要。我把它留作约会。怎么样:

    SELECT *
      FROM t
     WHERE t BETWEEN TRUNC(SYSDATE,'MI') 
                 AND TRUNC(SYSDATE,'MI')+1/24/60/60*59;
    

    TRUNC(...,'MI') 例如,几秒钟

    SELECT trunc(sysdate,'MI'), TRUNC(SYSDATE,'MI')+1/24/60/60*59 from dual;
    

    收益率

    2018-06-06 11:04:00    2018-06-06 11:04:59
    

    编辑:正如david faber指出的,只有当您的列具有数据类型 DATE . 对于数据类型 TIMESTAMP ,你最好用@mt0的解决方案。

        2
  •  2
  •   hakobot    7 年前

    你可以使用 TRUNC(SYSDATE,'MI') -> TRUNC('12:02:43','MI') = 12:02. 或者你可以用这个 select extract(MINUTE from current_timestamp) from dual;

        3
  •  2
  •   MT0    7 年前

    您可以将时间戳(和日期)截断到最接近的分钟,以便使用 TRUNC( SYSTIMESTAMP, 'MI' ) 四舍五入到当前分钟的开始并减去 INTERVAL '1' MINUTE 要开始前一分钟:

    select *
    from   table_name 
    where  time >= TRUNC( SYSTIMESTAMP, 'MI' ) - INTERVAL '1' MINUTE
    and    time <  TRUNC( SYSTIMESTAMP, 'MI' )