舍入到上一个2小时窗口Oracle SQL

舍入到上一个2小时窗口Oracle SQL,sql,oracle,datetime,Sql,Oracle,Datetime,我试图将日期(日期数据类型也包括时间戳)舍入到前2个小时的数据块。e、 g 13:23->12:00,18:12->18:00 我让它在MySQL中使用MOD函数: DATE_ADD(DATE(DATE_ADD(created_at, INTERVAL - 7 HOUR)), INTERVAL HOUR(DATE_ADD(created_at, INTERVAL - 6 HOUR)) - MOD(HOUR(DATE_ADD(created_at, INTERVAL - 6 HOUR)), 2)

我试图将日期(日期数据类型也包括时间戳)舍入到前2个小时的数据块。e、 g 13:23->12:00,18:12->18:00

我让它在MySQL中使用MOD函数:

DATE_ADD(DATE(DATE_ADD(created_at, INTERVAL - 7 HOUR)), INTERVAL HOUR(DATE_ADD(created_at, INTERVAL - 6 HOUR)) - MOD(HOUR(DATE_ADD(created_at, INTERVAL - 6 HOUR)), 2) HOUR) AS Window_Start
**增加了复杂性,因为我还改变了时间a)以纠正7小时的时区差异,b)因为我需要在分组之前将时间偏移1小时。但这不是问题所在

但我无法让它在Oracle平台上运行。具体来说,我似乎无法提取时间的小时数作为一个数字输入MOD()。我一直在尝试使用CAST、TO_TIMESTAMP和TO_CHAR,但似乎没有任何效果。通常的错误是“数据类型不一致”

提取仅适用于时间戳类型,而不适用于日期。而TO_时间戳只对字符串有效。但是提取(到)时间戳(到)字符(也不起作用)


我相信有一种更简单的方法可以做到这一点…

在Oracle中,一种方法是使用日期算术。例如:

select date '2000-01-01' + floor((sysdate - date '2000-01-01') * (24 / 2)) / (24 / 2)
from dual;

“24”表示一天中的小时。“2”表示要截断为的两小时时间段。

在Oracle中,一种方法是使用日期算术。例如:

select date '2000-01-01' + floor((sysdate - date '2000-01-01') * (24 / 2)) / (24 / 2)
from dual;

“24”代表一天中的几个小时。“2”代表你想要截断的两个小时的时间段。

我不确定这是否是答案,但它会给你一个兔子洞:

select sysdate as curr_dt, to_date(to_char(sysdate - interval '2' hour, 'yyyy-mm-dd HH24')) as two_hours_ago from dual;

希望有帮助!

我不确定这是不是答案,但它会给你一个兔子洞来追赶:

select sysdate as curr_dt, to_date(to_char(sysdate - interval '2' hour, 'yyyy-mm-dd HH24')) as two_hours_ago from dual;

希望能有所帮助!

以数字格式获取小时数,这样就行了

从dual中选择TO_NUMBER(TO_CHAR(SYSDATE,'HH'))


您可以使用此日期格式DD/MM/YYYY HH:MI:SS的时间戳部分单独选择每件物品。

以数字格式获取小时,这将起作用

从dual中选择TO_NUMBER(TO_CHAR(SYSDATE,'HH'))


您可以使用此日期格式DD/MM/YYYY HH:MI:SS的时间戳部分单独选择每个工件。

不久前我编写了此通用函数:

CREATE 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 TRUNC(created_at) + TRUNC(EXTRACT(HOUR FROM created_at) / 2) * 2 * INTERVAL '1' HOUR
FROM ...

不久前,我编写了以下通用函数:

CREATE 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 TRUNC(created_at) + TRUNC(EXTRACT(HOUR FROM created_at) / 2) * 2 * INTERVAL '1' HOUR
FROM ...

日期数据类型值的小时部分可以使用
to_char()
函数提取,该函数与
hh
hh24
格式元素类似于
to_number(to_char(sysdate,'hh24'))
。使用
to_number()
函数将转换结果显式转换为数字数据类型。可以使用
to_char()
函数和
hh
hh24
格式元素提取日期数据类型值的小时部分,如
to_number(to_char(sysdate,'hh24'))
。使用
to_number()
函数,用于将转换结果显式转换为数字数据类型。