我想在我的数据库中找到在最后一分钟内有时间戳的行。
例如:
当它是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方式。
答案 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的解决方案更好。