#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.