我有一个稍微复杂的时间算术问题。我有一个提醒系统,用户可以设置“事件前有多少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.tult_prevent.down Here =‘minutes’,因此,该方法将是计算(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的结束可能会扰乱日期的比较。
我尝试了几乎所有类型的日期范围算法,但无法在此查询中获得合格的记录。
发布于 2011-01-11 15:21:51
根据您的服务器及其负载,一分钟的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')https://stackoverflow.com/questions/4658933
复制相似问题