2013-07-07 2 views
0

Таким образом у меня есть таблица phone_numbers в Rails 3.2, и я хотел бы иметь возможность сделать запрос, такие как следующие:Math с DateTime в SQL запроса в рельсах

PhoneNumber.where("last_called_at - #{Time.now} > call_spacing * 60") 

где last_called_at является datetime и call_spacing - целое число, представляющее количество минут между вызовами.

Я попытался выше, я также попытался использовать

PhoneNumber.where("datediff(mi, last_called_at, #{Time.now}) > call_spacing") 

Если кто-нибудь может помочь мне сделать эту работу, или даже рекомендуют ток, уточненный рельсы SQL камень, я был бы очень признательна.

Edit: Так что лучший способ сделать эту работу для меня было вместо добавления ready_at столбец в моей базе данных, и обновление, когда либо call_spacing или last_called_at был обновлен, используя метод before_save. Это, вероятно, самый семантический способ подхода к этой проблеме в рельсах.

ответ

1

Вы должны использовать цитаты вокруг # {Time.now}. Для того, чтобы сделать вашу первую работу запроса вы можете использовать функцию TIME_TO_SEC():

PhoneNumber.where("(TIME_TO_SEC('#{Time.now}') - TIME_TO_SEC(last_called_at)) > (call_spacing * 60)") 

Вот мой способ сделать это:

PhoneNumber.where("last_called_at > '#{Time.zone.now.utc - (call_spacing * 60)}'") 

также взглянуть на эту статью, чтобы знать, как играть с часовыми поясами:

http://danilenko.org/2012/7/6/rails_timezones/

+0

Ok, я думаю, что это находится на правильном пути, но часть проблемы с этим запросом, что 'call_spacing' не является локальным переменным, его столбец базы данных. – OneChillDude

+0

Ждать, к сожалению, я не могу вычитать что-либо из даты в SQL ??? – OneChillDude

+0

Пока вы хотите сравнить его с call_spacing, который является целым значением, вы можете использовать TIME_TO_SEC для этих дат, а затем выполнять вычисления с использованием секунд. Повторите сначала запрос в моем ответе. Это должен быть хороший путь. Есть ли еще что-то сделать, чем заданная проблема? – pkubicki

Смежные вопросы