与纯SQL查询相比,Rails控制台查询返回不同的结果

时间:2011-04-10 19:05:28

标签: sql ruby-on-rails activerecord

所以在我的Rails控制台中,我有一个生成SQL的活动记录查询。我查看了我的logs/development,我可以看到正在生成的SQL。

出于某种原因,当我运行活动记录查询时,我没有得到预期的结果。我查看了我的日志并将sql复制/粘贴到连接到我的数据库的控制台中,然后突然返回正确的结果。任何想法为什么会这样?我正在使用PostgreSQL。

我正在努力寻找过去5小时内开业的商店。

EDIT减去10个小时使这个查询工作....

ActiveRecord调用(来自geokit gem):

Store.within(10, :origin =>[30.267153000000000, -97.743060799999970]).where("date > current_timestamp - interval '5 hours'")

SQL生成:

SELECT "store".*, 
 (ACOS(least(1,COS(0.5282614750548792)*COS(-1.705938231937002)*COS(RADIANS(store.lat))*COS(RADIANS(store.lng))+
 COS(0.5282614750548792)*SIN(-1.705938231937002)*COS(RADIANS(store.lat))*SIN(RADIANS(store.lng))+
 SIN(0.5282614750548792)*SIN(RADIANS(store.lat))))*3963.19)
 AS distance FROM "store" WHERE ((store.lat>30.122583147146404 AND store.lat<30.41172285285359 AND store.lng>-97.91044799232348 AND store.lng<-97.57567360767642)) AND ((
 (ACOS(least(1,COS(0.5282614750548792)*COS(-1.705938231937002)*COS(RADIANS(store.lat))*COS(RADIANS(store.lng))+
 COS(0.5282614750548792)*SIN(-1.705938231937002)*COS(RADIANS(store.lat))*SIN(RADIANS(store.lng))+
 SIN(0.5282614750548792)*SIN(RADIANS(store.lat))))*3963.19)
 <= 10)) AND (date > current_timestamp - interval '5 hours')

1 个答案:

答案 0 :(得分:0)

. . . .where("date > current_timestamp - interval '5 hours'")

此WHERE子句的标准SQL语法应为

WHERE "date" > current_timestamp - interval '5' hour

在标准SQL中, date 是保留字;用作列名的保留字必须是双引号。请注意,该数字在单引号内,并且未引用关键字 interval hour 。对标准SQL的支持变化很大,尤其是在您的社区。 (引用保留字和日期算术。)

所以。 。 。检查目标平台的文档,确保正确引用(或不引用)这两件事。

我很难说服自己,这可能是你问题的原因。