Как получить записи с разницей в 5 минут или меньше | Оракул

В настоящее время я застрял в этом подходе, не понимаю, как мне нужно minus с current timestamp и найти все записи, которые отличаются от 5 minutes or less

Мой стол

create table demo ( id number, modified_date timestamp(6) );

insert into demo values(1,to_timestamp('10-MAY-19 07.14.15.066000000 AM','DD-MON-RR HH.MI.SSXFF AM'));   
insert into demo values(5,to_timestamp('10-MAY-19 07.16.11.064000000 AM','DD-MON-RR HH.MI.SSXFF AM'));    
insert into demo values(3,to_timestamp('10-MAY-19 07.15.13.062000000 AM','DD-MON-RR HH.MI.SSXFF AM'));
insert into demo values(12,to_timestamp('10-MAY-19 07.18.10.056000000 AM','DD-MON-RR HH.MI.SSXFF AM'));
insert into demo values(14,to_timestamp('10-MAY-19 07.20.09.046000000 AM','DD-MON-RR HH.MI.SSXFF AM'));

Данные в таблице

id  modified_date 
1   10-MAY-19 07.14.15.066000000 AM
5   10-MAY-19 07.16.11.064000000 AM
3   10-MAY-19 07.15.13.062000000 AM
12  10-MAY-19 07.18.10.056000000 AM
14  10-MAY-19 07.20.09.046000000 AM

Мой запрос не дает ответа в течение нескольких минут

select modified_date - current_timestamp as dt_minutes from demo;

Ожидается: нужна запись как разница 5 minutes or less с current_timestamp.

id  modified_date                    date_differenence    
1   10-MAY-19 07.14.15.066000000 AM  modified_date - current_timestamp ( in minutes )
5   10-MAY-19 07.16.11.064000000 AM  modified_date - current_timestamp ( in minutes )
3   10-MAY-19 07.15.13.062000000 AM  modified_date - current_timestamp ( in minutes )
12  10-MAY-19 07.18.10.056000000 AM  modified_date - current_timestamp ( in minutes )
14  10-MAY-19 07.20.09.046000000 AM  modified_date - current_timestamp ( in minutes )

Примечание:

NLS_LANGUAGE = 'AMERICAN'
NLS_TIMESTAMP_TZ_FORMAT = 'DD-MON-RR HH.MI.SSXFF AM TZR'
NLS_CALENDAR ='GREGORIAN'

🤔 А знаете ли вы, что...
SQL поддерживает подзапросы (subqueries) для выполнения вложенных запросов.


1
61
2

Ответы:

Решено

Используйте INTERVAL DAY TO SECOND:

SELECT id,
       modified_date,
       current_date,
       modified_date - current_timestamp AS interval_difference,
       EXTRACT(MINUTE FROM modified_date - current_timestamp) AS minutes_difference
FROM   demo
WHERE  modified_date BETWEEN CURRENT_TIMESTAMP - INTERVAL '5' MINUTE
                         AND CURRENT_TIMESTAMP + INTERVAL '5' MINUTE;

Используйте ABS(EXTRACT(MINUTE FROM current_date - modified_date)), если знак вас не беспокоит.

Что для примера данных:

CREATE TABLE demo (
  id NUMBER,
  modified_date TIMESTAMP(6)
);

INSERT INTO demo (id, modified_date)
  SELECT 1, CURRENT_TIMESTAMP + INTERVAL '10' MINUTE FROM DUAL UNION ALL
  SELECT 2, CURRENT_TIMESTAMP + INTERVAL '5:01' MINUTE TO SECOND FROM DUAL UNION ALL
  SELECT 3, CURRENT_TIMESTAMP + INTERVAL '5:00' MINUTE TO SECOND FROM DUAL UNION ALL
  SELECT 4, CURRENT_TIMESTAMP + INTERVAL '4:59' MINUTE TO SECOND FROM DUAL UNION ALL
  SELECT 5, CURRENT_TIMESTAMP + INTERVAL '0' MINUTE FROM DUAL UNION ALL
  SELECT 6, CURRENT_TIMESTAMP - INTERVAL '4:59' MINUTE TO SECOND FROM DUAL UNION ALL
  SELECT 7, CURRENT_TIMESTAMP - INTERVAL '5:01' MINUTE TO SECOND FROM DUAL UNION ALL
  SELECT 8, CURRENT_TIMESTAMP - INTERVAL '5' YEAR FROM DUAL;

Выходы:

ИДЕНТИФИКАТОР MODIFIED_DATE ТЕКУЩАЯ ДАТА INTERVAL_DIFFERENCE MINUTES_DIFFERENCE 3 2024-07-07 15:42:27.262701 2024-07-07 15:37:27 +000000000 00:04:59.975026 4 4 2024-07-07 15:42:26.262701 2024-07-07 15:37:27 +000000000 00:04:58.975026 4 5 2024-07-07 15:37:27.262701 2024-07-07 15:37:27 -000000000 00:00:00.024974 0 6 2024-07-07 15:32:28.262701 2024-07-07 15:37:27 -000000000 00:04:59.024974 -4

рабочий пример


Я попробовал это таким образом, и это сработало. В случае возникновения каких-либо проблем в запросе mu. Пожалуйста, помогите мне исправить это вместе с объяснением.

SELECT
    id,
    modified_date,
    EXTRACT(MINUTE FROM CAST(current_timestamp AS TIMESTAMP))                                                         AS cur_minutes,
    EXTRACT(MINUTE FROM CAST(modified_date AS TIMESTAMP))                                                             AS mod_minutes,
    EXTRACT(MINUTE FROM CAST(current_timestamp AS TIMESTAMP)) - EXTRACT(MINUTE FROM CAST(modified_date AS TIMESTAMP)) AS min_diff
FROM
    demo
WHERE
    modified_date > current_timestamp - INTERVAL '5' MINUTE;