Неожиданные результаты запроса SQL с метками времени BETWEEN

Я создал небольшое тестовое приложение для отслеживания проблемы, с которой я столкнулся в Postgres на 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 | текст | категория | время начала | конечное время | создание       
----+-----------------------------+----------+---------------------+---------------------+---------------------
  1 | Работа над некоторыми 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 ряда)

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

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

1 ответ

Решение

Проверьте тип данных столбцов и ваш часовой пояс. Вы можете сбить с толку timestamp with time zone а также timestamp,

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

Переключите оба к timestamptz, или же timestamp если часовые пояса не имеют никакого отношения к вам. (Если сомневаетесь, используйте timestamptz.)

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

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

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

Другие вопросы по тегам