Ошибка PostgreSQL на Heroku с "МЕЖДУ"

Я изучаю странную проблему на Героку. Кажется, что только в доступе к среде хостинга, а не к базе данных.

Я создал небольшое тестовое приложение после истечения срока действия проблемы для его отслеживания.

Это исходный код моего тестового приложения: http://snippi.com/s/xd511rf

Как вы видите в строке 49, я хочу получить все записи, которые были созданы сегодня! Это будут первые два элемента моих тестовых данных с помощью Ruby Gem DataMapper.

Когда я запускаю это приложение на своем ноутбуке (Ubuntu 12.10, HP, Ruby 1.9.3), все правильно, я получаю эти данные, что правильно:

[
{
    "id": 1,
    "text": "Working on some awsomenewss",
    "category": 0,
    "starttime": "2013-03-21T15:56:00+01:00",
    "endtime": "2013-03-21T18:26:00+01:00",
    "creation": "2013-03-21T16:15:21+01:00"
},
{
    "id": 2,
    "text": "facebooking",
    "category": 0,
    "starttime": "2013-03-21T20:48:00+01:00",
    "endtime": "2013-03-21T22:26:00+01:00",
    "creation": "2013-03-21T16:15:21+01:00"
}
]

В моей консоли отладки этот SQL-запрос регистрируется:

SELECT "id", "text", "category", "starttime", "endtime", "creation" 
  FROM "entries" 
  WHERE "starttime" 
    BETWEEN '2013-03-21T00:00:00+00:00' 
      AND '2013-03-21T23:59:59+00:00' 
  ORDER BY "id"

Но затем я подтолкнул приложение к Heroku и возникла очень странная ошибка. Когда я запустил его сейчас (http://afternoon-everglades-4239.herokuapp.com/), это ответ:

[]

Почему он пуст?

Данные находятся в базе данных, которая доказана этим Dataclip из Heroku: https://dataclips.heroku.com/hygziosyxwperyctwfbhjzgbzhbj

Также, когда я запускаю руководство по командам SQL через'heroku pg: psql', он действительно работает с этим выходом:

 id |            text             | category |      starttime      |       endtime       |      creation       
----+-----------------------------+----------+---------------------+---------------------+---------------------
  1 | Working on some awsomenewss |        0 | 2013-03-21 15:56:00 | 2013-03-21 18:26:00 | 2013-03-21 16:15:21
  2 | facebooking                 |        0 | 2013-03-21 20:48:00 | 2013-03-21 22:26:00 | 2013-03-21 16:15:21
(2 rows)

Журналы не содержат ошибок ЛЮБОЕ или дополнительной информации. Я использовал удаленную базу данных Heroku PostgreSQL в обоих случаях (Production и Local).

Так почему же это не работает?

Спасибо за вашу помощь, Кевин

4b9b3361

Вы подключены к правой базе данных? Попробуйте SELECT * FROM starttime; в том же сеансе.

Если вы: проверьте тип данных столбцов и часовой пояс. Вы можете ввести в заблуждение timestamp with time zone и timestamp.
По внешнему виду у вас есть timestamp в вашей таблице, но запрос с timestamptz. Таким образом, все зависит от локального часового пояса вашего сеанса (который по умолчанию задает часовой пояс сервера, если не указано иное).
Переключитесь на timestamptz или просто timestamp, если часовые пояса не имеют к вам отношения.

Не причина вашей проблемы, но ваш запрос должен быть:

SELECT id, text, category, starttime, endtime, creation 
FROM   entries 
WHERE  starttime >= '2013-03-21 0:0'::timestamp
AND    starttime <  '2013-03-22 0:0'::timestamp
ORDER  BY id

Или даже проще:

SELECT id, text, category, starttime, endtime, creation 
FROM   entries 
WHERE  starttime >= '2013-03-21'::date
AND    starttime <  '2013-03-22'::date
ORDER  BY id

a BETWEEN x AND y почти всегда неправильно для timestamp типов - дробные числа! Что бы ваш запрос сделал с starttime = '2013-03-21T23:59:59.123+00'?

2
ответ дан 21 марта '13 в 19:41
источник