我们如何获得15分钟的时间间隔

时间:2019-10-23 08:04:23

标签: sql oracle oracle12c

我正在尝试以这种方式获取每15分钟的数据,如果当前时间是23-10-19 11:11:30,那么我需要从23-10-19 10:30:59获取数据到23-10-19 10:45:59以相同的方式,如果时间是23-10-19 11:15:30,那么我需要从23-10-19 10:45:59到23- 10-19 11:00:59。

我尝试忘记15分钟的延迟,但没有忘记我想采取的方法。请建议我如何应对这种情况

select concat(to_char(current_timestamp - numtodsinterval(30,'MINUTE'),'yyyy-mm-dd hh24:mi'),':59') A, 
concat(to_char(current_timestamp - numtodsinterval(15,'MINUTE'),'yyyy-mm-dd hh24:mi'),':59') B, 
to_char(current_timestamp,'yyyy-mm-dd hh24:mi:ss') C from dual 

下面是我得到的输出。

A                   B                   C                  
------------------- ------------------- -------------------
2019-10-23 13:03:59 2019-10-23 13:18:59 2019-10-23 13:33:22

3 个答案:

答案 0 :(得分:1)

您可以将时间截断为最接近的分钟数以使秒为零,然后减去分钟数以返回小时后最接近的15分钟间隔,然后应用偏移量:

SELECT TRUNC( current_timestamp, 'MI' )
         - MOD( EXTRACT( MINUTE FROM current_timestamp ), 15 ) * INTERVAL '1' MINUTE
         - INTERVAL '30' MINUTE
         + INTERVAL '59' SECOND AS start_time,
       TRUNC( current_timestamp, 'MI' )
         - MOD( EXTRACT( MINUTE FROM current_timestamp ), 15 ) * INTERVAL '1' MINUTE
         - INTERVAL '15' MINUTE
         + INTERVAL '59' SECOND AS end_time,
       current_timestamp
FROM   DUAL

输出:

START_TIME          | END_TIME            | CURRENT_TIMESTAMP            
:------------------ | :------------------ | :----------------------------
2019-10-23 09:00:59 | 2019-10-23 09:15:59 | 2019-10-23 09:42:53.742684000

db <>提琴here

答案 1 :(得分:0)

这是另一种解决方法:

WITH t AS 
    (SELECT TRUNC(CURRENT_TIMESTAMP , 'hh') + TRUNC(EXTRACT(MINUTE FROM CURRENT_TIMESTAMP ) / 15) * INTERVAL '15' MINUTE - INTERVAL '30' MINUTE AS Base
    FROM dual)
SELECT Base + INTERVAL '59' SECOND AS begin_time,
    Base + INTERVAL '15:59' minute to SECOND AS end_time
FROM t;

它基于我的通用Interval函数:

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(CURRENT_TIMESTAMP, INTERVAL '15' MINUTE) from dual;

加上/减去您的恒定偏移量。

答案 2 :(得分:0)

select :start_date + (1/96)*(level-1) from dual connect by level < :intervals