ActiveRecord的基于动态时间的查找程序

时间:2011-01-11 14:57:48

标签: ruby-on-rails activerecord

我有一个稍微复杂的时间算术问题。 我有一个提醒系统,用户可以设置“事件前x多少”的持续时间。例如:如果我设置'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 :(得分:0)

根据您的服务器及其负载,cron的一分钟窗口可能会有点乐观。

如果登录到dbms服务器并执行该SQL语句会发生什么?返回任何行?有错误信息吗?

您可以尝试显式类型转换。所以

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

您的dbms可能需要使用不同的语法进行类型转换和转换。搜索您的文档。

您的列名称区分大小写吗?列“何时”或“何时”? (或者wHen?)

此查询返回您的测试事件。请注意列名称周围的双引号。

SELECT "calendars".* 
FROM "calendars" 
WHERE ("when" >= '2011-01-10 15:56' 
   AND "when" <  '2011-01-10 15:57')