2015-09-25 3 views
0

У меня вопрос о получении данных БД.Cast created_at to timestamp при построении запроса

У меня есть модель Notification, у нее есть стандартный атрибут Rails created_at. Как вы знаете, в том же время ActiveSupport::TimeWithZone объекта на доступе, это свойство действительно имеет очень точное значение, которое вы можете получить доступ к литью его to_i или даже to_f

Так что теперь я хочу написать where пункт для Notification модели и найти уведомление, был создан через определенное время. Но так как множественные уведомления may've были созданы в ту же секунду, я хочу больше точности в моем запросе, так что я пытаюсь написать статью так:

Notification.where('created_at > ?', timestamp) 

и doesen't похоже на работу.

Как мне создать значение created_at, чтобы иметь возможность сравнивать его с меткой времени?

+0

Это не имеет супер точное значение. '.to_i' [Возвращает значение времени как целое число секунд со времен Эпохи] (http://ruby-doc.org/core-2.2.0/Time.html#method-i-to_i). Это все еще в секундах, а не в миллисекундах. –

+0

как насчет [to_f] (http://ruby-doc.org/core-2.2.0/Time.html#method-i-to_f)? Имеет ли он более точное значение? – borisano

+1

Это зависит от того, хранит ли ваша база данных миллисекунды. –

ответ

1

Отслеживание отметки времени отлично, даже на подсерии.

Попробуйте поэкспериментировать:

# create two users 
u1 = User.create(name:'user1') 
u2 = User.create(name:'user2') 
d1 = u1.created_at 
d2 = u2.created_at 

# update d1 so that it's exact second (milliseconds = 0) 
# update d2 so that it's exactly d1 + 0.5sec 
d1 = d1 - (d1.to_f - d1.to_i) 
d2 = d1 + 0.5 
u1.created_at = d1 
u2.created_at = d2 

# now create a timestamp just between d1 and d2 
d0 = d1 + 0.25 

# those queries now give expectable results 
User.where('created_at<?',d0).count # => 1 
User.where('created_at>?',d0).count # => 1 

Будьте осторожны:

User.where('created_at=?',d1).count # => 0 
User.where('created_at=?',d2).count # => 0 

но

d1 = u1.created_at 
User.where('created_at=?',d1).count # => 1