В настоящее время я застрял в этом подходе, не понимаю, как мне нужно 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) для выполнения вложенных запросов.
Используйте 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;
Выходы:
Я попробовал это таким образом, и это сработало. В случае возникновения каких-либо проблем в запросе 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;