Неожиданные результаты запроса 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'
?