首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于动态时间的ActiveRecord测距仪

基于动态时间的ActiveRecord测距仪
EN

Stack Overflow用户
提问于 2011-01-11 14:57:47
回答 1查看 338关注 0票数 1

我有一个稍微复杂的时间算术问题。我有一个提醒系统,用户可以设置“事件前有多少x”持续时间。例如:如果我设置'5分钟‘-我需要得到提醒前5分钟的活动时间表。

在我的提醒系统中,我有一个每分钟运行一次并发送提醒邮件的cron。到目前一切尚好。我希望找到所有符合提醒条件的日历事件(日历条目,其预定时间介于"5.minutes.from_now和6.minutes.from_now“之间)。

我正在尝试写以下where子句:

代码语言:javascript
复制
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语句是:

代码语言:javascript
复制
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的结束可能会扰乱日期的比较。

我尝试了几乎所有类型的日期范围算法,但无法在此查询中获得合格的记录。

EN

回答 1

Stack Overflow用户

发布于 2011-01-11 15:21:51

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

如果登录到dbms服务器并执行该SQL语句,会发生什么情况?有退货吗?有错误信息吗?

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

代码语言:javascript
复制
'when' >= CAST('2011-01-11 14:44:54' AS DATETIME) ...

对于类型转换和转换,dbms可能需要不同的语法。搜查你的文档。

您的列名是否区分大小写?列是“什么时候”还是“什么时候”?(或者wHen?)

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

代码语言:javascript
复制
SELECT "calendars".* 
FROM "calendars" 
WHERE ("when" >= '2011-01-10 15:56' 
   AND "when" <  '2011-01-10 15:57')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4658933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档