选择最后一分钟内的行

时间:2018-06-06 10:52:30

标签: sql oracle

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

例如:

当它是12:02:43 - >从12:01:00到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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您可以将时间戳(和日期)截断到最近的分钟 - 这样您就可以使用TRUNC( SYSTIMESTAMP, 'MI' )舍入到当前分钟的开头并减去INTERVAL '1' MINUTE以获得前一分钟的开头:

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

答案 2 :(得分:1)

你是对的,将它转换为字符串后面似乎没必要。我把它留作约会。怎么样:

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的解决方案更好。