繁体   English   中英

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

[英]How can we get the 15 minutes time interval

我试图以这样的方式获取每 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 

下面是我得到的 output。

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

您可以截断到最近的分钟以将秒数归零,然后减去分钟数以返回到一小时后最近的 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<> 在这里摆弄

另一种解决方案是:

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;

它基于我的通用间隔 function:

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;

加/减你的恒定偏移量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM