我有一个稍微复杂的时间算术问题。 我有一个提醒系统,用户可以设置“事件前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的结束可能会使日期比较变得混乱。
我尝试了几乎所有类型的日期范围算法,但无法在此查询中获得符合条件的记录。
答案 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')