甲骨文获得 1 小时回溯日期

Oracle get 1hr back date

在 Oracle 中,我想获取特定的时间间隔。

考虑一下,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

如何通过查询得到这个时间段。如果您观察到此日期期间比当前 HH24 格式倒退 1 小时并四舍五入为 00:00。查询应该适用于我设置的任何内容。以上日期为 1 小时。我应该可以设置任意小时数,例如 2 小时、3 小时等。

类似于:

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 之间不必要的上下文切换)。

这是一个例子

WITH dt AS
  ( SELECT ROUND(sysdate,'HH') hour_date FROM dual
  )
SELECT hour_date - 1/24, hour_date FROM dt
  1. 将日期四舍五入到最近的小时数。
  2. 对于oracle Date算法,DATE类型减1就是24小时,所以1/24就是一小时,以此类推

这将是一个通用函数,您可以将其用于适合 "higher range"

的任何区间
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' HOURINTERVAL '30' MINUTE