2016-12-12 3 views
0

В Oracle я хочу получить определенные интервалы.Oracle получает 1 час назад

Рассмотрите, sysdate 10-dec-2016 10:15:23 (dd-mon-yyyy hh24: mi: ss). Я хочу получить дату, как 10-dec-2016 09:00:00 до 10-dec-2016 10:00:00

Как получить этот период даты через запрос. Если вы заметили, что этот период даты находится на расстоянии 1 часа от текущего формата HH24 и округляется до 00:00. Запрос должен работать независимо от того, что я установил. Вышеуказанный период составляет 1 час. Я должен быть в состоянии установить на любое количество часов, как 2hrs, 3hrs и т.д.

ответ

1

Что-то вроде:

select trunc(your_date, 'hh') - number_of_hours_to_go_back/24 start_dt, 
     trunc(your_date, 'hh') end_dt 
from dual; 

, если вам это нужно в SQL заявление, или:

declare 
    v_date date := to_date('10/12/2016 10:15:23', 'dd/mm/yyyy hh24:mi:ss'); 
    v_start_dt date; 
    v_end_dt date; 
    v_num_hours_back integer; 
begin 
    v_start_dt := trunc(v_date, 'hh') - v_num_hours_back/24; 
    v_end_dt := trunc(v_date, 'hh'); 
end; 
/

если вам нужно это в PL/SQL (чтобы сохранить ненужное переключение контекста между SQL и PL/SQL).

+0

Это работало. Благодарю. Но это работает в течение 1 часа и выше. можете ли вы настроить его даже на 1/2 часа? Если текущее время 10-dec-2016 10:45:00, мне нужен период с 10-го по 2016 год с 10:00 до 10-дек-2016 10:30:00 – user661981

+1

Это помогло бы, если бы вы могли включил все ваши сценарии в ваш первоначальный вопрос, чтобы мы лучше поняли, что вы были после этого! – Boneist

+0

Вы правы. Запрос должен работать в течение 1/2 часа, 1 часа, 2 часа и т. Д. – user661981

1

Вот пример

WITH dt AS 
    (SELECT ROUND(sysdate,'HH') hour_date FROM dual 
) 
SELECT hour_date - 1/24, hour_date FROM dt 
  1. Круглый дата ближайшего часа.
  2. Для оракул Дата арифметике, вычитанием 1 из типа DATE 24 часа, поэтому 1/24 является один час и т.д.
0

Это будет общая функция, которую вы можете использовать для любого интервала, который вписывается в " более высокий диапазон»

CREATE OR REPLACE FUNCTION MakeInterval(ts IN TIMESTAMP, roundInterval IN INTERVAL DAY TO SECOND) RETURN TIMESTAMP DETERMINISTIC IS 
    denom INTEGER; 
BEGIN 
    IF roundInterval >= INTERVAL '1' HOUR THEN 
     denom := EXTRACT(HOUR FROM roundInterval); 
     IF MOD(24, denom) <> 0 THEN 
      RAISE VALUE_ERROR; 
     END IF; 
     RETURN TRUNC(ts) + TRUNC(EXTRACT(HOUR FROM ts)/denom) * denom * INTERVAL '1' HOUR; 
    ELSIF roundInterval >= INTERVAL '1' MINUTE THEN 
     denom := EXTRACT(MINUTE FROM roundInterval); 
     IF MOD(60, denom) <> 0 THEN 
      RAISE VALUE_ERROR; 
     END IF; 
     RETURN TRUNC(ts, 'hh') + TRUNC(EXTRACT(MINUTE FROM ts)/denom) * denom * INTERVAL '1' MINUTE; 
    ELSE 
     denom := EXTRACT(SECOND FROM roundInterval);     
     IF MOD(60, denom) <> 0 THEN 
      RAISE VALUE_ERROR; 
     END IF; 
     RETURN TRUNC(ts, 'mi') + TRUNC(EXTRACT(SECOND FROM ts)/denom) * denom * INTERVAL '1' SECOND; 
    END IF; 
END MakeInterval; 


select 
    MakeInterval(TO_TIMESTAMP('10-dec-2016 10:15:23', 'dd-mon-yyyy hh24:mi:ss'), INTERVAL '1' HOUR) as time 
from dual; 

Для других интервалов использовать INTERVAL '2' HOUR или INTERVAL '30' MINUTE и т.д.