甲骨文获得 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
- 将日期四舍五入到最近的小时数。
- 对于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' HOUR
或 INTERVAL '30' MINUTE
等
在 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
- 将日期四舍五入到最近的小时数。
- 对于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' HOUR
或 INTERVAL '30' MINUTE
等