#sql #postgresql
#sql #postgresql
Вопрос:
Я хочу удалить все строки со значением временной метки старше столбца даты из таблицы в POSTGRES.
Чтобы удалить строки старше определенной временной метки, я использовал это —
SELECT * from gps_coordinates WHERE sattime < NOW() - INTERVAL 7 DAY;
Теперь я хотел получить интервал времени из другой таблицы и удалить строки на основе этого. Я не могу понять, как. Я попробовал это. но это не работает —
DELETE from gps_coordinates where sattime < NOW() - INTERVAL || (SELECT backup_day as days from gps_devices WHERE id=11) || 'DAY'
а также это —
DELETE from gps_coordinates where sattime < NOW() - INTERVAL (SELECT backup_day as days from gps_devices WHERE id=11) || 'DAY'
это выдает ОШИБКУ: синтаксическая ошибка в «SELECT» или рядом с ним
Требуется помощь
Ответ №1:
Вы можете объединять и приводить:
DELETE FROM gps_coordinates
WHERE sattime < now()
- ((SELECT backup_day
FROM gps_devices
WHERE id = 11)
|| 'day')::interval;
Однако подзапрос всегда должен возвращать не более одной строки.
Ответ №2:
Я думаю, что вы хотите этого:
DELETE FROM gps_coordinates
WHERE sattime < NOW() - INTERVAL '1 day' * (SELECT backup_day FROM gps_devices WHERE id=11);
Или с помощью функции MAKE_INTERVAL()
:
DELETE FROM gps_coordinates
WHERE sattime < NOW() - MAKE_INTERVAL(days => (SELECT backup_day FROM gps_devices WHERE id=11));