Как получить записи с разницей в 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'

Все образцы данных в вашем вопросе относятся к маю 2019 года; в этом месяце июль 2024 года, и ни одна из ваших строк не будет находиться в пределах 5 минут от текущей даты (даже в течение 5 лет). Пожалуйста, объясните на английском языке (не в коде), какую логику вы собираетесь реализовать и каков ожидаемый результат для вашего примера данных?

MT0 07.07.2024 16:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

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

Я пробовал по-другому, ниже мой ответ. Спасибо за ваши ответы. Помогите мне исправить мое приведенное ниже решение, если оно неверно.

quora question 07.07.2024 14:40

Похоже, запрос не может получить для меня записи. Можете ли вы проверить вопрос еще раз? Я обновил несколько дополнительных сведений о моей системе NLS в примечаниях. Это проблема, из-за которой невозможно получить какие-либо записи.

quora question 07.07.2024 15:16

не могли бы вы помочь мне решить эту проблему

quora question 07.07.2024 15:43

Я попробовал это таким образом, и это сработало. В случае возникновения каких-либо проблем в запросе 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;

Это неверно, поскольку если текущее время — 12:03:00, а измененное время — 11:59:00, тогда 3 - 59 = -56 фактическая разница составляет 4 минут. Вам нужно извлечь минуты из разницы интервалов (после вычитания), а не из времени (до вычитания). Я обновил свой ответ.

MT0 07.07.2024 14:46

Другие вопросы по теме