Дали +1 к ответу Джастина за оригинальность.
Если вы хотите более педантичный (или, возможно, более понятный или поддерживаемый) подход,
select case when to_number(to_char(sysdate,'mi')) > 30
then trunc(sysdate,'mi') + ((60 - to_number(to_char(sysdate,'mi')) +30)/1440)
else trunc(sysdate,'mi') + (30 - to_number(to_char(sysdate,'mi')))/1440 end
from dual
Ятолько добавив это, так как это может быть более адаптируемым подходом, если вам нужно сделать что-то похожее с другими числами, например, через 45 минут после часа.Вы бы просто заменили три 30-х на 45-и, и все, и вы уходите.
Для производительности, но для вашей конкретной проблемы - Джастин - настоящий победитель.