Сравнение времени в Postgres и Rails - PullRequest
0 голосов
/ 03 ноября 2018

Очень просто, у меня есть запрос:

@current_user.items.where('updated_at > ? AND updated_at < ?', last_sync_time_from_client, current_time)

Моя проблема, я думаю, что сравниваемое время в базе данных и last_sync_time_from_client сравниваются на основе числа с плавающей запятой. Это всегда приводит к истине updated_at > last_sync_time_from_client, даже если время идентично секунде.

1008 * Т.е. *

(db item)updated_at.to_f # 1541246811.022979
last_sync_time.to_f # 1541246811.0

Это означает, что времена, одинаковые с точностью до секунды, будут возвращать странности. Есть ли способ исправить это, или я должен просто добавить секунду в last_sync_time_from_client, чтобы учесть, что Rails здесь странный?

1 Ответ

0 голосов
/ 04 ноября 2018

Вот три решения. Решение 1 является лучшим (неразрушающим). Решения 2 и 3 напрямую влияют на сохраненные значения в базе данных, поэтому выбирайте их на свой страх и риск.

Раствор 1

Использование

date_trunc('second', updated_at);

вместо updated_at. Подробнее см. ответ на «Отмена миллисекундной части из отметки времени» .

Решение 2

Force Rails всегда обновляет отметку времени с точностью до секунды, обрезая вспомогательную часть до нуля.

См. ответ на вопрос "Есть ли способ изменить временные метки по умолчанию в Rails на Ymd H: i: s (вместо Ymd H: i: su) или заставить laravel игнорировать десятичную часть Ymd H: i: su ? "

Раствор 3

Сделать точность столбца updated_at в базе данных в секунду, в отличие от стандартной доли секунды (например, миллисекунды).

См. ответы на вопрос «Как изменить миграцию rails t.timestamps для использования timestamp(0) without timezone в postgres» , чтобы узнать, как это сделать с миграцией Rails.

...