Перевод Sqlite в Postgres (Heroku) Дата / время

#sql #ruby-on-rails-3 #sqlite #postgresql #heroku

#sql #ruby-on-rails-3 #sqlite #postgresql #heroku

Вопрос:

Я получаю сообщение об ошибке при запуске приложения Rails 3 в рабочую среду на Heroku (postgres), в то время как локально (sqlite) код работает нормально — я взглянул на руководство Postgres, но безрезультатно:

Мой код:

(strftime(‘%s’,’now’) — strftime(‘%s’, posts.created_at)

Ошибка:

СТРОКА 1: ВЫБЕРИТЕ posts.*, ((strftime(‘%s’,’now’) -…
ПОДСКАЗКА: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, потребуется добавить явное приведение типов.

Ответ №1:

В PostgreSQL у вас нет функции strftime. Чтобы вычислить количество секунд между датами, вы можете использовать:

 SELECT extract(epoch from now() - posts.created_at);
  

Также важно отметить, что в PostgreSQL у вас есть тип данных interval, поэтому, если вы просто вычтете (now() — posts.created_at), это вернет вам удобный тип interval, который можно легко форматировать с помощью to_char .

Ответ №2:

Что именно должна делать эта функция?

Для форматирования столбца даты или метки времени используйте to_char()

Чтобы вычислить разницу в днях между двумя датами, просто используйте: now() - posts.created_at (предполагая, что created_at является столбцом типа date )

Если created_at это не date столбец (что было бы большой ошибкой), вам нужно использовать to_date() для преобразования строки в дату.

Комментарии:

1. Это приложение Rails, поэтому created_at должно быть timestamp .

Ответ №3:

Между типами даты / времени форматирования и функциями postgres вам необходимо выработать точный синтаксис.

Если вы стремитесь к переносимости между sqlite и postgres, возможным решением является определение функции strftime в postgres.