我创建了一个小测试应用程序来跟踪我在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
另外,当我通过herheroku pg:psql麓手动运行SQL命令时,它实际上可以与以下输出一起使用:
id | 文字| 类别| 开始时间 结束时间| 创建 ---- + --------------------------------------------- + ---------- + ---- ----------------- + --------------------- + ---------- ----------- 1 | 正在处理一些awsomenews | 0 | 2013-03-21 15:56:00 | 2013-03-21 18:26:00 | 2013-03-21 16:15:21 2 | 脸书| 0 | 2013-03-21 20:48:00 | 2013-03-21 22:26:00 | 2013-03-21 16:15:21 (2列)
日志不包含任何错误或更多信息。在这两种情况下(生产环境和本地环境),我都使用了 远程Heroku PostgreSQL数据库 。
那么为什么这行不通呢?
检查列的 数据类型 和您的 时区 。您可能会感到困惑 timestamp with time zone 和 timestamp 。
timestamp with time zone
timestamp
看起来像您timestamp的表中一样,但是使用进行查询timestamptz。这样,这完全取决于会话的本地时区(如果未另行指定,则默认为服务器的时区)。
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'什么?
a BETWEEN x AND y
starttime = '2013-03-21T23:59:59.123+00'