У меня есть немного сложная проблема арифметики времени.
У меня есть система напоминаний, где пользователь может установить продолжительность «сколько х до события». Например: если я установил «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 может испортить сравнение дат.
Я испробовал почти все виды арифметики диапазона дат, но не смог получить подходящие записи в этом запросе.