Динамический поиск по времени для ActiveRecord - PullRequest
1 голос
/ 11 января 2011

У меня есть немного сложная проблема арифметики времени. У меня есть система напоминаний, где пользователь может установить продолжительность «сколько х до события». Например: если я установил «5 минут» - мне нужно получить напоминание до 5 минут расписания мероприятия.

В моей системе напоминаний у меня есть cron, который запускается каждую минуту и ​​отправляет письма с напоминанием. Все идет нормально. Я хочу найти все события календаря, которые могут напоминать (запись календаря, чье запланированное время находится между "5.minutes.from_now и 6.minutes.from_now"

Я пытаюсь написать следующее предложение where:

conds = "'when' >= '#{eval("#{cal.remind_before.to_s}.#{cal.remind_before_what.downcase}.from_now").to_s(:db)}' AND 'when' < '#{eval("#{cal.remind_before.to_s}.#{cal.remind_before_what.downcase}.from_now + 1.minutes").to_s(:db)}'"

@mail_calendar_for_reminder= Calendar.find(:all, :conditions=> conds)     

Здесь cal.reminder_before = '5', cal.remind_before_what.downcase = 'minutes' так что eval будет оценивать (5.minutes.from_now) и (6.minutes.from_now)

Результирующий оператор SQL:

SELECT "calendars".* FROM "calendars" WHERE ('when' >= '2011-01-11 14:44:54' AND 'when' < '2011-01-11 14:45:54')

Этот SQL синтаксически и логически корректен, потому что он получает временные интервалы 5.minutes.from_now и 6.minutes.from_now. Но это не выбор подходящих записей. Я подозреваю две вещи: 1. Приведенный выше SQL выполняет сравнение строк, а не сравнение по времени. 2. Запись в базе данных для запланированного времени календаря имеет следующий формат:
2011-01-11 14: 45: 09. 000000 - конец 0 может испортить сравнение дат.

Я испробовал почти все виды арифметики диапазона дат, но не смог получить подходящие записи в этом запросе.

1 Ответ

0 голосов
/ 11 января 2011

В зависимости от вашего сервера и его загрузки, одно минутное окно для cron может быть немного оптимистичным.

Что произойдет, если вы войдете на сервер dbms и выполните этот оператор SQL? Какие-нибудь строки возвращены? Есть сообщения об ошибках?

Вы можете попробовать явное приведение типа. Итак

'when' >= CAST('2011-01-11 14:44:54' AS DATETIME) ...

Для ваших баз данных может потребоваться другой синтаксис для приведения типов и преобразования. Ищите свои документы.

Ваши имена столбцов чувствительны к регистру? Столбец «когда» или «когда»? (Или когда?)

Этот запрос возвращает ваше тестовое событие. Обратите внимание на двойные кавычки вокруг названия столбца.

SELECT "calendars".* 
FROM "calendars" 
WHERE ("when" >= '2011-01-10 15:56' 
   AND "when" <  '2011-01-10 15:57')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...