我已经创建了一个小测试应用来追踪我在Heroku上遇到Postgres时遇到的问题: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/)时,这就是响应:
[]
为什么它是空的?
数据肯定在数据库中,这是由Heroku的Dataclip证明的:https://dataclips.heroku.com/hygziosyxwperyctwfbhjzgbzhbj
此外,当我通过'machine pg:psql'手动运行SQL命令时,它实际上可以使用此输出:
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数据库。
那为什么这不起作用?
答案 0 :(得分:2)
检查列的数据类型和时区。您可能会感到困惑timestamp with time zone
and 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'
有什么作用?