使用BETWEEN时间戳的SQL查询的意外结果

我创建了一个小测试应用程序来追踪我在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的Dataclipcertificate的: https ://dataclips.heroku.com/hygziosyxwperyctwfbhjzgbzhbj

此外,当我通过’heroku pg:psql’手动运行SQL命令时,它实际上适用于此输出:

  id | 文字| 类别|  starttime | 结束时间| 创建       
 ---- + ----------------------------- + ---------- + ---- ----------------- + --------------------- + ---------- -----------
   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数据库 (生产和本地)。

那为什么这不起作用?

检查列的数据类型时区 。 您可能会将timestamp with time zonetimestamp混淆。

看起来您的表中有timestamp ,但查询timestamptz 。 这样,一切都取决于会话的本地时区(如果没有另外指定,则默认为服务器的时区。)

如果时区与您完全无关,请将timestamp切换为timestamptztimestamp 。 (如有疑问,请使用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 

由于小数,因此timestamp类型的a BETWEEN x AND y 几乎总是错误的! 你的查询对starttime = '2013-03-21T23:59:59.123+00'什么?