Число в формате даты при использовании Rails и Postgres - PullRequest
0 голосов
/ 30 августа 2018

У меня есть приложение Rails, которое использует Postgresql.

Пожалуйста, проверьте следующую команду и ее вывод из консоли Rails:

[11] pry(main)> User.last.created_at_before_type_cast
  User Load (0.6ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> "2018-08-29 11:10:46.526069"

Что представляет собой число 526069 и как оно генерируется?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Postgres хранит временные метки с часовыми поясами для внутреннего использования с использованием UTC , однако перед отображением ActiveRecord выполнит сериализацию / типизацию в соответствии с часовым поясом вашего приложения.

pry(main)>d = DateTime.now.in_time_zone("Asia/Kolkata") => Sat, 07 Oct 2017 00:38:26 IST +05:30 pry(main)> Booking.where('created_at > ?', d).count (1.4ms) SELECT COUNT(*) FROM "bookings" WHERE (created_at > '2017-10-06 19:08:40.011480')

Как видите, d был преобразован в UTC для поиска в базе данных postgres.
Метод create_at_before_type_cast вернет значение created_at в точности так, как оно хранится в базе данных, без сериализации / преобразования типов на основе конфигурации ActiveRecord.

Как уже указывал bkimble: числа в конце - это миллисекунды.

Для более глубокого понимания вам следует взглянуть на следующее:

0 голосов
/ 30 августа 2018

Это представляет микросекунды. См. https://ruby -doc.org / core-2.2.2 / Time.html . По умолчанию все время имеет микросекунды. Проверьте это сами, применив Time.now к плавающему:

Time.now.to_f
= > 1535595572.4089978

Если вы хотите сбросить микросекунды, приведите его к int:

Time.now.to_i
=> 1535595649

Я бы предположил, что поле типа 'create_at_before_type_cast' представляет время до того, как оно приведено к целому числу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...